@odx/angular 12.13.1 → 12.14.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @odx/angular
2
2
 
3
+ ## 12.14.1
4
+
5
+ ### Patch Changes
6
+
7
+ - eded9a0: common type SortDirection for all kind of sorting
8
+
9
+ ## 12.14.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 236139a: New default sort function
14
+
3
15
  ## 12.13.1
4
16
 
5
17
  ### Patch Changes
@@ -1,3 +1,15 @@
1
- export * from './sort-direction';
2
- export * from './sort-state';
1
+ export { SortStatus as SortState } from '@odx/angular/components/table';
2
+ /**
3
+ * @deprecated Use `SortDirection` from `@odx/angular/utils` directly instead.
4
+ * Will be removed in a future version.
5
+ *
6
+ * ```typescript
7
+ * // Instead of:
8
+ * // import { SortDirection } from '@odx/angular/components/data-table';
9
+ *
10
+ * // Use:
11
+ * import { SortDirection } from '@odx/angular/utils';
12
+ * ```
13
+ */
14
+ export { SortDirection } from '@odx/angular/utils';
3
15
  export * from './table-variant';
@@ -1,7 +1,6 @@
1
1
  import { OnInit } from '@angular/core';
2
2
  import { FormControl, FormGroup } from '@angular/forms';
3
3
  import { SortStatus, TableHeaderCell } from '../../models';
4
- import { TableSortVariant } from '../../models/sort-variant';
5
4
  import * as i0 from "@angular/core";
6
5
  /**
7
6
  * HeaderTitleComponent provides the functionality for a table header cell, including sorting and checkbox
@@ -34,11 +33,11 @@ export declare class HeaderTitleComponent implements OnInit {
34
33
  */
35
34
  get getSortStatus(): SortStatus;
36
35
  /**
37
- * Returns the icon or indicator for the current sorting status (ascending, descending, unsorted).
36
+ * Returns the icon name for the current sorting status (ascending, descending).
38
37
  *
39
- * @returns {TableSortVariant}
38
+ * @returns {string}
40
39
  */
41
- get sortIcon(): TableSortVariant;
40
+ get sortIcon(): string;
42
41
  /**
43
42
  * Toggles the sorting status of the column and informs the table component of the change.
44
43
  */
@@ -1,5 +1,5 @@
1
- import { TableSortVariant } from './sort-variant';
1
+ import { SortDirection } from '@odx/angular/utils';
2
2
  export interface SortStatus {
3
3
  column: string;
4
- sortVariant: TableSortVariant;
4
+ sortVariant?: SortDirection;
5
5
  }
@@ -1,6 +1,21 @@
1
- export type TableSortVariant = typeof TableSortVariant[keyof typeof TableSortVariant];
1
+ import { SortDirection } from '@odx/angular/utils';
2
+ /**
3
+ * @deprecated Use `SortDirection` from `@odx/angular/utils` instead.
4
+ * Consider using `SortDirection | undefined` or `SortDirection | null` to represent an unsorted state.
5
+ * Defines the possible sort states for a table column.
6
+ */
7
+ export type TableSortVariant = 'unsorted' | SortDirection;
8
+ /**
9
+ * @deprecated Use `SortDirection` from `@odx/angular/utils` instead.
10
+ * Consider using `SortDirection | undefined` or `SortDirection | null` to represent an unsorted state.
11
+ * Constant object representing the available sort states for a table column.
12
+ * @property {string} UNSORTED - The column is not sorted.
13
+ * @property {string} ASC - The column is sorted in ascending order (equivalent to `SortDirection.ASC`).
14
+ * @property {string} DESC - The column is sorted in descending order (equivalent to `SortDirection.DESC`).
15
+ * @readonly
16
+ */
2
17
  export declare const TableSortVariant: {
3
- readonly UNSORTED: "unsorted";
4
18
  readonly ASC: "asc";
5
19
  readonly DESC: "desc";
20
+ readonly UNSORTED: "unsorted";
6
21
  };
@@ -1,4 +1,15 @@
1
- export * from './sort-direction';
2
- export * from './sort-state';
1
+ /**
2
+ * @deprecated Use `SortDirection` from `@odx/angular/utils` directly instead.
3
+ * Will be removed in a future version.
4
+ *
5
+ * ```typescript
6
+ * // Instead of:
7
+ * // import { SortDirection } from '@odx/angular/components/data-table';
8
+ *
9
+ * // Use:
10
+ * import { SortDirection } from '@odx/angular/utils';
11
+ * ```
12
+ */
13
+ export { SortDirection } from '@odx/angular/utils';
3
14
  export * from './table-variant';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9kYXRhLXRhYmxlL3NyYy9saWIvbW9kZWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vc29ydC1kaXJlY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9zb3J0LXN0YXRlJztcbmV4cG9ydCAqIGZyb20gJy4vdGFibGUtdmFyaWFudCc7XG4iXX0=
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9kYXRhLXRhYmxlL3NyYy9saWIvbW9kZWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELGNBQWMsaUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBTb3J0U3RhdHVzIGFzIFNvcnRTdGF0ZSB9IGZyb20gJ0BvZHgvYW5ndWxhci9jb21wb25lbnRzL3RhYmxlJztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYFNvcnREaXJlY3Rpb25gIGZyb20gYEBvZHgvYW5ndWxhci91dGlsc2AgZGlyZWN0bHkgaW5zdGVhZC5cbiAqIFdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEluc3RlYWQgb2Y6XG4gKiAvLyBpbXBvcnQgeyBTb3J0RGlyZWN0aW9uIH0gZnJvbSAnQG9keC9hbmd1bGFyL2NvbXBvbmVudHMvZGF0YS10YWJsZSc7XG4gKlxuICogLy8gVXNlOlxuICogaW1wb3J0IHsgU29ydERpcmVjdGlvbiB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHsgU29ydERpcmVjdGlvbiB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5leHBvcnQgKiBmcm9tICcuL3RhYmxlLXZhcmlhbnQnO1xuIl19
@@ -2,9 +2,9 @@ import { CommonModule } from '@angular/common';
2
2
  import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostBinding, inject, Input, ViewEncapsulation } from '@angular/core';
3
3
  import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
4
4
  import { CheckboxComponent } from '@odx/angular/components/checkbox';
5
- import { untilDestroyed } from '@odx/angular/utils';
5
+ import { IconComponent } from '@odx/angular/components/icon';
6
+ import { SortDirection, untilDestroyed } from '@odx/angular/utils';
6
7
  import { tap } from 'rxjs';
7
- import { TableSortVariant } from '../../models/sort-variant';
8
8
  import { TABLE } from '../../table.config';
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "@angular/forms";
@@ -32,15 +32,19 @@ export class HeaderTitleComponent {
32
32
  * @returns {SortStatus}
33
33
  */
34
34
  get getSortStatus() {
35
- return { column: this.item?.name, sortVariant: TableSortVariant.UNSORTED };
35
+ return { column: this.item?.name, sortVariant: undefined };
36
36
  }
37
37
  /**
38
- * Returns the icon or indicator for the current sorting status (ascending, descending, unsorted).
38
+ * Returns the icon name for the current sorting status (ascending, descending).
39
39
  *
40
- * @returns {TableSortVariant}
40
+ * @returns {string}
41
41
  */
42
42
  get sortIcon() {
43
- return this.sortStatus.sortVariant;
43
+ if (this.sortStatus.sortVariant === SortDirection.ASC)
44
+ return 'sort-down';
45
+ if (this.sortStatus.sortVariant === SortDirection.DESC)
46
+ return 'sort-up';
47
+ return 'sortable';
44
48
  }
45
49
  /**
46
50
  * Toggles the sorting status of the column and informs the table component of the change.
@@ -48,16 +52,13 @@ export class HeaderTitleComponent {
48
52
  sortColumn() {
49
53
  if (!this.item?.sortable)
50
54
  return;
51
- switch (this.sortStatus.sortVariant) {
52
- case TableSortVariant.DESC:
53
- case TableSortVariant.UNSORTED:
54
- this.table.clearSort();
55
- this.sortStatus = { ...this.sortStatus, sortVariant: TableSortVariant.ASC };
56
- break;
57
- case TableSortVariant.ASC:
58
- this.table.clearSort();
59
- this.sortStatus = { ...this.sortStatus, sortVariant: TableSortVariant.DESC };
60
- break;
55
+ if (this.sortStatus.sortVariant === SortDirection.DESC || !this.sortStatus.sortVariant) {
56
+ this.table.clearSort();
57
+ this.sortStatus = { ...this.sortStatus, sortVariant: SortDirection.ASC };
58
+ }
59
+ else if (this.sortStatus.sortVariant === SortDirection.ASC) {
60
+ this.table.clearSort();
61
+ this.sortStatus = { ...this.sortStatus, sortVariant: SortDirection.DESC };
61
62
  }
62
63
  this.table.sorted.emit(this.sortStatus);
63
64
  }
@@ -65,7 +66,7 @@ export class HeaderTitleComponent {
65
66
  * Resets the sort status to unsorted.
66
67
  */
67
68
  clearSortStatus() {
68
- this.sortStatus = { column: this.item?.name, sortVariant: TableSortVariant.UNSORTED };
69
+ this.sortStatus = this.getSortStatus;
69
70
  this.check();
70
71
  }
71
72
  /**
@@ -112,15 +113,15 @@ export class HeaderTitleComponent {
112
113
  return this.item.width ?? 'auto';
113
114
  }
114
115
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeaderTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
115
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: HeaderTitleComponent, isStandalone: true, selector: "th[odxHeaderTitle]", inputs: { item: "item" }, host: { properties: { "style.width": "this.columnWidth" } }, ngImport: i0, template: "@if (item.check) {\n <div class=\"odx-table__check\">\n <div [formGroup]=\"checkForm\">\n <odx-checkbox [checked]=\"checked\" [indeterminate]=\"indeterminate\" formControlName=\"check\" />\n </div>\n </div>\n} @else {\n <div class=\"odx-table__header-cell-title\" (click)=\"sortColumn()\" [class.sortable]=\"item.sortable\">\n {{ item.title }}\n @if (item.sortable) {\n @switch (sortIcon) {\n @case ('unsorted') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\">\n <path d=\"m14,5H2v-2h12v2Zm-4,2H2v2h8v-2Zm-4,4H2v2h4v-2Z\" style=\"fill: var(--blue-700)\" />\n </svg>\n }\n @case ('desc') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\">\n <polygon points=\"11 6 8 3 5 6 7 6 7 13 9 13 9 6 11 6\" style=\"fill: var(--blue-700)\" />\n </svg>\n }\n @case ('asc') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\">\n <polygon points=\"5 10 8 13 11 10 9 10 9 3 7 3 7 10 5 10\" style=\"fill: var(--blue-700)\" />\n </svg>\n }\n }\n }\n </div>\n <ng-content select=\"odx-form-field\" />\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CheckboxComponent, selector: "odx-checkbox", inputs: ["indeterminate"], outputs: ["indeterminateChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
116
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: HeaderTitleComponent, isStandalone: true, selector: "th[odxHeaderTitle]", inputs: { item: "item" }, host: { properties: { "style.width": "this.columnWidth" } }, ngImport: i0, template: "@if (item.check) {\n <div class=\"odx-table__check\">\n <div [formGroup]=\"checkForm\">\n <odx-checkbox [checked]=\"checked\" [indeterminate]=\"indeterminate\" formControlName=\"check\" />\n </div>\n </div>\n} @else {\n <div class=\"odx-table__header-cell-title\" (click)=\"sortColumn()\" [class.sortable]=\"item.sortable\">\n {{ item.title }}\n @if (item.sortable) {\n <odx-icon iconSet=\"core\" [name]=\"sortIcon\" size=\"small\" />\n }\n </div>\n <ng-content select=\"odx-form-field\" />\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CheckboxComponent, selector: "odx-checkbox", inputs: ["indeterminate"], outputs: ["indeterminateChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
116
117
  }
117
118
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeaderTitleComponent, decorators: [{
118
119
  type: Component,
119
- args: [{ selector: 'th[odxHeaderTitle]', standalone: true, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, CheckboxComponent, ReactiveFormsModule], template: "@if (item.check) {\n <div class=\"odx-table__check\">\n <div [formGroup]=\"checkForm\">\n <odx-checkbox [checked]=\"checked\" [indeterminate]=\"indeterminate\" formControlName=\"check\" />\n </div>\n </div>\n} @else {\n <div class=\"odx-table__header-cell-title\" (click)=\"sortColumn()\" [class.sortable]=\"item.sortable\">\n {{ item.title }}\n @if (item.sortable) {\n @switch (sortIcon) {\n @case ('unsorted') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\">\n <path d=\"m14,5H2v-2h12v2Zm-4,2H2v2h8v-2Zm-4,4H2v2h4v-2Z\" style=\"fill: var(--blue-700)\" />\n </svg>\n }\n @case ('desc') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\">\n <polygon points=\"11 6 8 3 5 6 7 6 7 13 9 13 9 6 11 6\" style=\"fill: var(--blue-700)\" />\n </svg>\n }\n @case ('asc') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\">\n <polygon points=\"5 10 8 13 11 10 9 10 9 3 7 3 7 10 5 10\" style=\"fill: var(--blue-700)\" />\n </svg>\n }\n }\n }\n </div>\n <ng-content select=\"odx-form-field\" />\n}\n" }]
120
+ args: [{ selector: 'th[odxHeaderTitle]', standalone: true, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, CheckboxComponent, ReactiveFormsModule, IconComponent], template: "@if (item.check) {\n <div class=\"odx-table__check\">\n <div [formGroup]=\"checkForm\">\n <odx-checkbox [checked]=\"checked\" [indeterminate]=\"indeterminate\" formControlName=\"check\" />\n </div>\n </div>\n} @else {\n <div class=\"odx-table__header-cell-title\" (click)=\"sortColumn()\" [class.sortable]=\"item.sortable\">\n {{ item.title }}\n @if (item.sortable) {\n <odx-icon iconSet=\"core\" [name]=\"sortIcon\" size=\"small\" />\n }\n </div>\n <ng-content select=\"odx-form-field\" />\n}\n" }]
120
121
  }], propDecorators: { item: [{
121
122
  type: Input
122
123
  }], columnWidth: [{
123
124
  type: HostBinding,
124
125
  args: ['style.width']
125
126
  }] } });
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLXRpdGxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL3RhYmxlL3NyYy9saWIvY29tcG9uZW50cy9oZWFkZXItdGl0bGUvaGVhZGVyLXRpdGxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL3RhYmxlL3NyYy9saWIvY29tcG9uZW50cy9oZWFkZXItdGl0bGUvaGVhZGVyLXRpdGxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdJLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7QUFFM0M7Ozs7R0FJRztBQVVILE1BQU0sT0FBTyxvQkFBb0I7SUFUakM7UUFVbUIsVUFBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixRQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEMs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WUFBWSxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDOzhCQWN4RCxJQUFJO3NCQURWLEtBQUs7Z0JBMEdRLFdBQVc7c0JBRHhCLFdBQVc7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSG9zdEJpbmRpbmcsIGluamVjdCwgSW5wdXQsIE9uSW5pdCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDaGVja2JveENvbXBvbmVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci9jb21wb25lbnRzL2NoZWNrYm94JztcbmltcG9ydCB7IHVudGlsRGVzdHJveWVkIH0gZnJvbSAnQG9keC9hbmd1bGFyL3V0aWxzJztcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU29ydFN0YXR1cywgVGFibGVCb2R5Q2VsbCwgVGFibGVIZWFkZXJDZWxsIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IFRhYmxlU29ydFZhcmlhbnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvc29ydC12YXJpYW50JztcbmltcG9ydCB7IFRBQkxFIH0gZnJvbSAnLi4vLi4vdGFibGUuY29uZmlnJztcblxuLyoqXG4gKiBIZWFkZXJUaXRsZUNvbXBvbmVudCBwcm92aWRlcyB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgYSB0YWJsZSBoZWFkZXIgY2VsbCwgaW5jbHVkaW5nIHNvcnRpbmcgYW5kIGNoZWNrYm94XG4gKiBvcGVyYXRpb25zIGlmIGFwcGxpY2FibGUuIEl0IGhhbmRsZXMgY2hhbmdlcyBpbiBzb3J0IHN0YXRlIGFuZCBlbWl0cyByZWxldmFudCBldmVudHMgdG8gdGhlIHRhYmxlIGNvbXBvbmVudFxuICogdG8gbWFuYWdlIHNvcnRpbmcgYW5kIHNlbGVjdGlvbiBzdGF0ZSBhY3Jvc3MgdGhlIHRhYmxlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICd0aFtvZHhIZWFkZXJUaXRsZV0nLFxuICB0ZW1wbGF0ZVVybDogJy4vaGVhZGVyLXRpdGxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIENoZWNrYm94Q29tcG9uZW50LCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgSGVhZGVyVGl0bGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlID0gaW5qZWN0KFRBQkxFKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRha2VVbnRpbERlc3Ryb3llZCA9IHVudGlsRGVzdHJveWVkKCk7XG4gIHByaXZhdGUgc29ydFN0YXR1czogU29ydFN0YXR1cyA9IHRoaXMuZ2V0U29ydFN0YXR1cztcblxuICAvKipcbiAgICogVGhlIGhlYWRlciBjZWxsIGl0ZW0gY29udGFpbmluZyBtZXRhZGF0YSBsaWtlIGNvbHVtbiBuYW1lLCBzb3J0YWJpbGl0eSwgYW5kIHdoZXRoZXIgaXQgc2hvdWxkIGluY2x1ZGUgYSBjaGVja2JveC5cbiAgICpcbiAgICogQHR5cGUge1RhYmxlSGVhZGVyQ2VsbH1cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBpdGVtITogVGFibGVIZWFkZXJDZWxsO1xuXG4gIC8qKlxuICAgKiBGb3JtR3JvdXAgdG8gbWFuYWdlIHRoZSBjaGVja2JveCBzdGF0ZSB3aXRoaW4gdGhlIGhlYWRlci5cbiAgICpcbiAgICogQHR5cGUge0Zvcm1Hcm91cH1cbiAgICovXG4gIHB1YmxpYyBjaGVja0Zvcm0gPSBuZXcgRm9ybUdyb3VwKHsgY2hlY2s6IG5ldyBGb3JtQ29udHJvbChmYWxzZSkgfSk7XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IHNvcnQgc3RhdHVzIG9mIHRoZSBjb2x1bW4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgaGVhZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7U29ydFN0YXR1c31cbiAgICovXG4gIHB1YmxpYyBnZXQgZ2V0U29ydFN0YXR1cygpOiBTb3J0U3RhdHVzIHtcbiAgICByZXR1cm4geyBjb2x1bW46IHRoaXMuaXRlbT8ubmFtZSwgc29ydFZhcmlhbnQ6IFRhYmxlU29ydFZhcmlhbnQuVU5TT1JURUQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpY29uIG9yIGluZGljYXRvciBmb3IgdGhlIGN1cnJlbnQgc29ydGluZyBzdGF0dXMgKGFzY2VuZGluZywgZGVzY2VuZGluZywgdW5zb3J0ZWQpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7VGFibGVTb3J0VmFyaWFudH1cbiAgICovXG4gIHB1YmxpYyBnZXQgc29ydEljb24oKTogVGFibGVTb3J0VmFyaWFudCB7XG4gICAgcmV0dXJuIHRoaXMuc29ydFN0YXR1cy5zb3J0VmFyaWFudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBzb3J0aW5nIHN0YXR1cyBvZiB0aGUgY29sdW1uIGFuZCBpbmZvcm1zIHRoZSB0YWJsZSBjb21wb25lbnQgb2YgdGhlIGNoYW5nZS5cbiAgICovXG4gIHB1YmxpYyBzb3J0Q29sdW1uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pdGVtPy5zb3J0YWJsZSkgcmV0dXJuO1xuICAgIHN3aXRjaCAodGhpcy5zb3J0U3RhdHVzLnNvcnRWYXJpYW50KSB7XG4gICAgICBjYXNlIFRhYmxlU29ydFZhcmlhbnQuREVTQzpcbiAgICAgIGNhc2UgVGFibGVTb3J0VmFyaWFudC5VTlNPUlRFRDpcbiAgICAgICAgdGhpcy50YWJsZS5jbGVhclNvcnQoKTtcbiAgICAgICAgdGhpcy5zb3J0U3RhdHVzID0geyAuLi50aGlzLnNvcnRTdGF0dXMsIHNvcnRWYXJpYW50OiBUYWJsZVNvcnRWYXJpYW50LkFTQyB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVGFibGVTb3J0VmFyaWFudC5BU0M6XG4gICAgICAgIHRoaXMudGFibGUuY2xlYXJTb3J0KCk7XG5cbiAgICAgICAgdGhpcy5zb3J0U3RhdHVzID0geyAuLi50aGlzLnNvcnRTdGF0dXMsIHNvcnRWYXJpYW50OiBUYWJsZVNvcnRWYXJpYW50LkRFU0MgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy50YWJsZS5zb3J0ZWQuZW1pdCh0aGlzLnNvcnRTdGF0dXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgc29ydCBzdGF0dXMgdG8gdW5zb3J0ZWQuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJTb3J0U3RhdHVzKCk6IHZvaWQge1xuICAgIHRoaXMuc29ydFN0YXR1cyA9IHsgY29sdW1uOiB0aGlzLml0ZW0/Lm5hbWUsIHNvcnRWYXJpYW50OiBUYWJsZVNvcnRWYXJpYW50LlVOU09SVEVEIH07XG4gICAgdGhpcy5jaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBpdGVtcyBpbiB0aGUgY29sdW1uLCB1c2VkIHRvIGRldGVybWluZSBjaGVja2JveCBzdGF0ZS5cbiAgICpcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5kYXRhKCkuZmlsdGVyKChkOiBUYWJsZUJvZHlDZWxsKSA9PiBkW3RoaXMuaXRlbS5uYW1lXSkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGNvbXBvbmVudCB2aWV3LCB1c3VhbGx5IGFmdGVyIGEgc3RhdGUgY2hhbmdlLlxuICAgKi9cbiAgcHVibGljIGNoZWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY2hlY2tib3ggc2hvdWxkIGJlIG1hcmtlZCBhcyBjaGVja2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHB1YmxpYyBnZXQgY2hlY2tlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLml0ZW0uY2hlY2sgJiYgdGhpcy5pdGVtLm5hbWU7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZGF0YSgpLmV2ZXJ5KChpdGVtOiBUYWJsZUJvZHlDZWxsKSA9PiBjb2x1bW4gJiYgaXRlbVtjb2x1bW5dKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrQm94TGlzdGVuZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tCb3hMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXRlbS5jaGVjaykgcmV0dXJuO1xuICAgIHRoaXMuY2hlY2tGb3JtXG4gICAgICAuZ2V0KCdjaGVjaycpXG4gICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICB0aGlzLnRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgICB0YXAoKGNoZWNrKSA9PiB0aGlzLnRhYmxlLmNoZWNrZWQuZW1pdCh7IGNvbHVtbjogdGhpcy5pdGVtLm5hbWUsIGNoZWNrOiAhIWNoZWNrIH0pKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXRlcm1pbmF0ZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLml0ZW0uY2hlY2sgJiYgdGhpcy5pdGVtLm5hbWU7XG4gICAgY29uc3QgeyBsZW5ndGggfSA9IHRoaXMudGFibGUuZGF0YSgpO1xuICAgIGNvbnN0IHVuY2hlY2tlZCA9IGxlbmd0aCAtIHRoaXMudGFibGUuZGF0YSgpLmZpbHRlcigoaXRlbTogVGFibGVCb2R5Q2VsbCkgPT4gY29sdW1uICYmIGl0ZW1bY29sdW1uXSkubGVuZ3RoO1xuICAgIHJldHVybiB1bmNoZWNrZWQgPiAwICYmIHVuY2hlY2tlZCA8IGxlbmd0aDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnc3R5bGUud2lkdGgnKVxuICBwcm90ZWN0ZWQgZ2V0IGNvbHVtbldpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS53aWR0aCA/PyAnYXV0byc7XG4gIH1cbn1cbiIsIkBpZiAoaXRlbS5jaGVjaykge1xuICA8ZGl2IGNsYXNzPVwib2R4LXRhYmxlX19jaGVja1wiPlxuICAgIDxkaXYgW2Zvcm1Hcm91cF09XCJjaGVja0Zvcm1cIj5cbiAgICAgIDxvZHgtY2hlY2tib3ggW2NoZWNrZWRdPVwiY2hlY2tlZFwiIFtpbmRldGVybWluYXRlXT1cImluZGV0ZXJtaW5hdGVcIiBmb3JtQ29udHJvbE5hbWU9XCJjaGVja1wiIC8+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxufSBAZWxzZSB7XG4gIDxkaXYgY2xhc3M9XCJvZHgtdGFibGVfX2hlYWRlci1jZWxsLXRpdGxlXCIgKGNsaWNrKT1cInNvcnRDb2x1bW4oKVwiIFtjbGFzcy5zb3J0YWJsZV09XCJpdGVtLnNvcnRhYmxlXCI+XG4gICAge3sgaXRlbS50aXRsZSB9fVxuICAgIEBpZiAoaXRlbS5zb3J0YWJsZSkge1xuICAgICAgQHN3aXRjaCAoc29ydEljb24pIHtcbiAgICAgICAgQGNhc2UgKCd1bnNvcnRlZCcpIHtcbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwibTE0LDVIMnYtMmgxMnYyWm0tNCwySDJ2Mmg4di0yWm0tNCw0SDJ2Mmg0di0yWlwiIHN0eWxlPVwiZmlsbDogdmFyKC0tYmx1ZS03MDApXCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2Rlc2MnKSB7XG4gICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgPHBvbHlnb24gcG9pbnRzPVwiMTEgNiA4IDMgNSA2IDcgNiA3IDEzIDkgMTMgOSA2IDExIDZcIiBzdHlsZT1cImZpbGw6IHZhcigtLWJsdWUtNzAwKVwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdhc2MnKSB7XG4gICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgPHBvbHlnb24gcG9pbnRzPVwiNSAxMCA4IDEzIDExIDEwIDkgMTAgOSAzIDcgMyA3IDEwIDUgMTBcIiBzdHlsZT1cImZpbGw6IHZhcigtLWJsdWUtNzAwKVwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIDwvZGl2PlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJvZHgtZm9ybS1maWVsZFwiIC8+XG59XG4iXX0=
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLXRpdGxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL3RhYmxlL3NyYy9saWIvY29tcG9uZW50cy9oZWFkZXItdGl0bGUvaGVhZGVyLXRpdGxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL3RhYmxlL3NyYy9saWIvY29tcG9uZW50cy9oZWFkZXItdGl0bGUvaGVhZGVyLXRpdGxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdJLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzQixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQUUzQzs7OztHQUlHO0FBVUgsTUFBTSxPQUFPLG9CQUFvQjtJQVRqQztRQVVtQixVQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FB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QyxTQUFTOytCQUVFLG9CQUFvQixjQUVsQixJQUFJLGlCQUNELGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxDQUFDOzhCQWN2RSxJQUFJO3NCQURWLEtBQUs7Z0JBdUdRLFdBQVc7c0JBRHhCLFdBQVc7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSG9zdEJpbmRpbmcsIGluamVjdCwgSW5wdXQsIE9uSW5pdCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDaGVja2JveENvbXBvbmVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci9jb21wb25lbnRzL2NoZWNrYm94JztcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9pY29uJztcbmltcG9ydCB7IFNvcnREaXJlY3Rpb24sIHVudGlsRGVzdHJveWVkIH0gZnJvbSAnQG9keC9hbmd1bGFyL3V0aWxzJztcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU29ydFN0YXR1cywgVGFibGVCb2R5Q2VsbCwgVGFibGVIZWFkZXJDZWxsIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IFRBQkxFIH0gZnJvbSAnLi4vLi4vdGFibGUuY29uZmlnJztcblxuLyoqXG4gKiBIZWFkZXJUaXRsZUNvbXBvbmVudCBwcm92aWRlcyB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgYSB0YWJsZSBoZWFkZXIgY2VsbCwgaW5jbHVkaW5nIHNvcnRpbmcgYW5kIGNoZWNrYm94XG4gKiBvcGVyYXRpb25zIGlmIGFwcGxpY2FibGUuIEl0IGhhbmRsZXMgY2hhbmdlcyBpbiBzb3J0IHN0YXRlIGFuZCBlbWl0cyByZWxldmFudCBldmVudHMgdG8gdGhlIHRhYmxlIGNvbXBvbmVudFxuICogdG8gbWFuYWdlIHNvcnRpbmcgYW5kIHNlbGVjdGlvbiBzdGF0ZSBhY3Jvc3MgdGhlIHRhYmxlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICd0aFtvZHhIZWFkZXJUaXRsZV0nLFxuICB0ZW1wbGF0ZVVybDogJy4vaGVhZGVyLXRpdGxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIENoZWNrYm94Q29tcG9uZW50LCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBJY29uQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgSGVhZGVyVGl0bGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlID0gaW5qZWN0KFRBQkxFKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRha2VVbnRpbERlc3Ryb3llZCA9IHVudGlsRGVzdHJveWVkKCk7XG4gIHByaXZhdGUgc29ydFN0YXR1czogU29ydFN0YXR1cyA9IHRoaXMuZ2V0U29ydFN0YXR1cztcblxuICAvKipcbiAgICogVGhlIGhlYWRlciBjZWxsIGl0ZW0gY29udGFpbmluZyBtZXRhZGF0YSBsaWtlIGNvbHVtbiBuYW1lLCBzb3J0YWJpbGl0eSwgYW5kIHdoZXRoZXIgaXQgc2hvdWxkIGluY2x1ZGUgYSBjaGVja2JveC5cbiAgICpcbiAgICogQHR5cGUge1RhYmxlSGVhZGVyQ2VsbH1cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBpdGVtITogVGFibGVIZWFkZXJDZWxsO1xuXG4gIC8qKlxuICAgKiBGb3JtR3JvdXAgdG8gbWFuYWdlIHRoZSBjaGVja2JveCBzdGF0ZSB3aXRoaW4gdGhlIGhlYWRlci5cbiAgICpcbiAgICogQHR5cGUge0Zvcm1Hcm91cH1cbiAgICovXG4gIHB1YmxpYyBjaGVja0Zvcm0gPSBuZXcgRm9ybUdyb3VwKHsgY2hlY2s6IG5ldyBGb3JtQ29udHJvbChmYWxzZSkgfSk7XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IHNvcnQgc3RhdHVzIG9mIHRoZSBjb2x1bW4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgaGVhZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7U29ydFN0YXR1c31cbiAgICovXG4gIHB1YmxpYyBnZXQgZ2V0U29ydFN0YXR1cygpOiBTb3J0U3RhdHVzIHtcbiAgICByZXR1cm4geyBjb2x1bW46IHRoaXMuaXRlbT8ubmFtZSwgc29ydFZhcmlhbnQ6IHVuZGVmaW5lZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGljb24gbmFtZSBmb3IgdGhlIGN1cnJlbnQgc29ydGluZyBzdGF0dXMgKGFzY2VuZGluZywgZGVzY2VuZGluZykuXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBwdWJsaWMgZ2V0IHNvcnRJY29uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuc29ydFN0YXR1cy5zb3J0VmFyaWFudCA9PT0gU29ydERpcmVjdGlvbi5BU0MpIHJldHVybiAnc29ydC1kb3duJztcbiAgICBpZiAodGhpcy5zb3J0U3RhdHVzLnNvcnRWYXJpYW50ID09PSBTb3J0RGlyZWN0aW9uLkRFU0MpIHJldHVybiAnc29ydC11cCc7XG4gICAgcmV0dXJuICdzb3J0YWJsZSc7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgc29ydGluZyBzdGF0dXMgb2YgdGhlIGNvbHVtbiBhbmQgaW5mb3JtcyB0aGUgdGFibGUgY29tcG9uZW50IG9mIHRoZSBjaGFuZ2UuXG4gICAqL1xuICBwdWJsaWMgc29ydENvbHVtbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXRlbT8uc29ydGFibGUpIHJldHVybjtcbiAgICBpZiAodGhpcy5zb3J0U3RhdHVzLnNvcnRWYXJpYW50ID09PSBTb3J0RGlyZWN0aW9uLkRFU0MgfHwgIXRoaXMuc29ydFN0YXR1cy5zb3J0VmFyaWFudCkge1xuICAgICAgdGhpcy50YWJsZS5jbGVhclNvcnQoKTtcbiAgICAgIHRoaXMuc29ydFN0YXR1cyA9IHsgLi4udGhpcy5zb3J0U3RhdHVzLCBzb3J0VmFyaWFudDogU29ydERpcmVjdGlvbi5BU0MgfTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc29ydFN0YXR1cy5zb3J0VmFyaWFudCA9PT0gU29ydERpcmVjdGlvbi5BU0MpIHtcbiAgICAgIHRoaXMudGFibGUuY2xlYXJTb3J0KCk7XG4gICAgICB0aGlzLnNvcnRTdGF0dXMgPSB7IC4uLnRoaXMuc29ydFN0YXR1cywgc29ydFZhcmlhbnQ6IFNvcnREaXJlY3Rpb24uREVTQyB9O1xuICAgIH1cblxuICAgIHRoaXMudGFibGUuc29ydGVkLmVtaXQodGhpcy5zb3J0U3RhdHVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHNvcnQgc3RhdHVzIHRvIHVuc29ydGVkLlxuICAgKi9cbiAgcHVibGljIGNsZWFyU29ydFN0YXR1cygpOiB2b2lkIHtcbiAgICB0aGlzLnNvcnRTdGF0dXMgPSB0aGlzLmdldFNvcnRTdGF0dXM7XG4gICAgdGhpcy5jaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBpdGVtcyBpbiB0aGUgY29sdW1uLCB1c2VkIHRvIGRldGVybWluZSBjaGVja2JveCBzdGF0ZS5cbiAgICpcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5kYXRhKCkuZmlsdGVyKChkOiBUYWJsZUJvZHlDZWxsKSA9PiBkW3RoaXMuaXRlbS5uYW1lXSkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGNvbXBvbmVudCB2aWV3LCB1c3VhbGx5IGFmdGVyIGEgc3RhdGUgY2hhbmdlLlxuICAgKi9cbiAgcHVibGljIGNoZWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY2hlY2tib3ggc2hvdWxkIGJlIG1hcmtlZCBhcyBjaGVja2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHB1YmxpYyBnZXQgY2hlY2tlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLml0ZW0uY2hlY2sgJiYgdGhpcy5pdGVtLm5hbWU7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZGF0YSgpLmV2ZXJ5KChpdGVtOiBUYWJsZUJvZHlDZWxsKSA9PiBjb2x1bW4gJiYgaXRlbVtjb2x1bW5dKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrQm94TGlzdGVuZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tCb3hMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXRlbS5jaGVjaykgcmV0dXJuO1xuICAgIHRoaXMuY2hlY2tGb3JtXG4gICAgICAuZ2V0KCdjaGVjaycpXG4gICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICB0aGlzLnRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgICB0YXAoKGNoZWNrKSA9PiB0aGlzLnRhYmxlLmNoZWNrZWQuZW1pdCh7IGNvbHVtbjogdGhpcy5pdGVtLm5hbWUsIGNoZWNrOiAhIWNoZWNrIH0pKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXRlcm1pbmF0ZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLml0ZW0uY2hlY2sgJiYgdGhpcy5pdGVtLm5hbWU7XG4gICAgY29uc3QgeyBsZW5ndGggfSA9IHRoaXMudGFibGUuZGF0YSgpO1xuICAgIGNvbnN0IHVuY2hlY2tlZCA9IGxlbmd0aCAtIHRoaXMudGFibGUuZGF0YSgpLmZpbHRlcigoaXRlbTogVGFibGVCb2R5Q2VsbCkgPT4gY29sdW1uICYmIGl0ZW1bY29sdW1uXSkubGVuZ3RoO1xuICAgIHJldHVybiB1bmNoZWNrZWQgPiAwICYmIHVuY2hlY2tlZCA8IGxlbmd0aDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnc3R5bGUud2lkdGgnKVxuICBwcm90ZWN0ZWQgZ2V0IGNvbHVtbldpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS53aWR0aCA/PyAnYXV0byc7XG4gIH1cbn1cbiIsIkBpZiAoaXRlbS5jaGVjaykge1xuICA8ZGl2IGNsYXNzPVwib2R4LXRhYmxlX19jaGVja1wiPlxuICAgIDxkaXYgW2Zvcm1Hcm91cF09XCJjaGVja0Zvcm1cIj5cbiAgICAgIDxvZHgtY2hlY2tib3ggW2NoZWNrZWRdPVwiY2hlY2tlZFwiIFtpbmRldGVybWluYXRlXT1cImluZGV0ZXJtaW5hdGVcIiBmb3JtQ29udHJvbE5hbWU9XCJjaGVja1wiIC8+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxufSBAZWxzZSB7XG4gIDxkaXYgY2xhc3M9XCJvZHgtdGFibGVfX2hlYWRlci1jZWxsLXRpdGxlXCIgKGNsaWNrKT1cInNvcnRDb2x1bW4oKVwiIFtjbGFzcy5zb3J0YWJsZV09XCJpdGVtLnNvcnRhYmxlXCI+XG4gICAge3sgaXRlbS50aXRsZSB9fVxuICAgIEBpZiAoaXRlbS5zb3J0YWJsZSkge1xuICAgICAgPG9keC1pY29uIGljb25TZXQ9XCJjb3JlXCIgW25hbWVdPVwic29ydEljb25cIiBzaXplPVwic21hbGxcIiAvPlxuICAgIH1cbiAgPC9kaXY+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIm9keC1mb3JtLWZpZWxkXCIgLz5cbn1cbiJdfQ==
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC1zdGF0dXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90YWJsZS9zcmMvbGliL21vZGVscy9zb3J0LXN0YXR1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGFibGVTb3J0VmFyaWFudCB9IGZyb20gJy4vc29ydC12YXJpYW50JztcblxuZXhwb3J0IGludGVyZmFjZSBTb3J0U3RhdHVzIHtcbiAgY29sdW1uOiBzdHJpbmc7XG4gIHNvcnRWYXJpYW50OiBUYWJsZVNvcnRWYXJpYW50O1xufVxuIl19
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC1zdGF0dXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90YWJsZS9zcmMvbGliL21vZGVscy9zb3J0LXN0YXR1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU29ydERpcmVjdGlvbiB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ydFN0YXR1cyB7XG4gIGNvbHVtbjogc3RyaW5nO1xuICBzb3J0VmFyaWFudD86IFNvcnREaXJlY3Rpb247XG59XG4iXX0=
@@ -1,6 +1,16 @@
1
+ import { SortDirection } from '@odx/angular/utils';
2
+ /**
3
+ * @deprecated Use `SortDirection` from `@odx/angular/utils` instead.
4
+ * Consider using `SortDirection | undefined` or `SortDirection | null` to represent an unsorted state.
5
+ * Constant object representing the available sort states for a table column.
6
+ * @property {string} UNSORTED - The column is not sorted.
7
+ * @property {string} ASC - The column is sorted in ascending order (equivalent to `SortDirection.ASC`).
8
+ * @property {string} DESC - The column is sorted in descending order (equivalent to `SortDirection.DESC`).
9
+ * @readonly
10
+ */
1
11
  export const TableSortVariant = {
2
12
  UNSORTED: 'unsorted',
3
- ASC: 'asc',
4
- DESC: 'desc',
13
+ // ASC and DESC values are now inherited from SortDirection
14
+ ...SortDirection,
5
15
  };
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC12YXJpYW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvdGFibGUvc3JjL2xpYi9tb2RlbHMvc29ydC12YXJpYW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLEdBQUcsRUFBRSxLQUFLO0lBQ1YsSUFBSSxFQUFFLE1BQU07Q0FDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgVGFibGVTb3J0VmFyaWFudCA9IHR5cGVvZiBUYWJsZVNvcnRWYXJpYW50W2tleW9mIHR5cGVvZiBUYWJsZVNvcnRWYXJpYW50XTtcblxuZXhwb3J0IGNvbnN0IFRhYmxlU29ydFZhcmlhbnQgPSB7XG4gIFVOU09SVEVEOiAndW5zb3J0ZWQnLFxuICBBU0M6ICdhc2MnLFxuICBERVNDOiAnZGVzYycsXG59IGFzIGNvbnN0O1xuIl19
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC12YXJpYW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvdGFibGUvc3JjL2xpYi9tb2RlbHMvc29ydC12YXJpYW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVNuRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLDJEQUEyRDtJQUMzRCxHQUFHLGFBQWE7Q0FDUixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU29ydERpcmVjdGlvbiB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBTb3J0RGlyZWN0aW9uYCBmcm9tIGBAb2R4L2FuZ3VsYXIvdXRpbHNgIGluc3RlYWQuXG4gKiBDb25zaWRlciB1c2luZyBgU29ydERpcmVjdGlvbiB8IHVuZGVmaW5lZGAgb3IgYFNvcnREaXJlY3Rpb24gfCBudWxsYCB0byByZXByZXNlbnQgYW4gdW5zb3J0ZWQgc3RhdGUuXG4gKiBEZWZpbmVzIHRoZSBwb3NzaWJsZSBzb3J0IHN0YXRlcyBmb3IgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCB0eXBlIFRhYmxlU29ydFZhcmlhbnQgPSAndW5zb3J0ZWQnIHwgU29ydERpcmVjdGlvbjtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYFNvcnREaXJlY3Rpb25gIGZyb20gYEBvZHgvYW5ndWxhci91dGlsc2AgaW5zdGVhZC5cbiAqIENvbnNpZGVyIHVzaW5nIGBTb3J0RGlyZWN0aW9uIHwgdW5kZWZpbmVkYCBvciBgU29ydERpcmVjdGlvbiB8IG51bGxgIHRvIHJlcHJlc2VudCBhbiB1bnNvcnRlZCBzdGF0ZS5cbiAqIENvbnN0YW50IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGF2YWlsYWJsZSBzb3J0IHN0YXRlcyBmb3IgYSB0YWJsZSBjb2x1bW4uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVU5TT1JURUQgLSBUaGUgY29sdW1uIGlzIG5vdCBzb3J0ZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQVNDIC0gVGhlIGNvbHVtbiBpcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIChlcXVpdmFsZW50IHRvIGBTb3J0RGlyZWN0aW9uLkFTQ2ApLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IERFU0MgLSBUaGUgY29sdW1uIGlzIHNvcnRlZCBpbiBkZXNjZW5kaW5nIG9yZGVyIChlcXVpdmFsZW50IHRvIGBTb3J0RGlyZWN0aW9uLkRFU0NgKS5cbiAqIEByZWFkb25seVxuICovXG5leHBvcnQgY29uc3QgVGFibGVTb3J0VmFyaWFudCA9IHtcbiAgVU5TT1JURUQ6ICd1bnNvcnRlZCcsXG4gIC8vIEFTQyBhbmQgREVTQyB2YWx1ZXMgYXJlIG5vdyBpbmhlcml0ZWQgZnJvbSBTb3J0RGlyZWN0aW9uXG4gIC4uLlNvcnREaXJlY3Rpb24sXG59IGFzIGNvbnN0O1xuIl19
@@ -18,6 +18,7 @@ export * from './match-url';
18
18
  export * from './ng-changes';
19
19
  export * from './provide-config';
20
20
  export * from './queue';
21
+ export * from './sorter';
21
22
  export * from './type-guards';
22
23
  export * from './until-destroyed';
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvdXRpbHMvc3JjL2xpYi9oZWxwZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsT0FBTyxDQUFDO0FBQ3RCLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLFNBQVMsQ0FBQztBQUN4QixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hbmd1bGFyJztcbmV4cG9ydCAqIGZyb20gJy4vYW5pbWF0aW9ucy1oYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vYXJyYXknO1xuZXhwb3J0ICogZnJvbSAnLi9idWlsZC11cmwnO1xuZXhwb3J0ICogZnJvbSAnLi9idWlsZC13ZWJzaXRlLXVybCc7XG5leHBvcnQgKiBmcm9tICcuL2NhY2hlLXN0b3JhZ2UtY2xpZW50JztcbmV4cG9ydCAqIGZyb20gJy4vY29lcmNpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9kZWJvdW5jZSc7XG5leHBvcnQgKiBmcm9tICcuL2RlZmVyLWZuJztcbmV4cG9ydCAqIGZyb20gJy4vZG9tJztcbmV4cG9ydCAqIGZyb20gJy4vZXZlbnQtbWFuYWdlcic7XG5leHBvcnQgKiBmcm9tICcuL2dldC1heGlzJztcbmV4cG9ydCAqIGZyb20gJy4vZ2V0LWxhbmd1YWdlLWNvZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9nZXQtb3Bwb3NpdGUtc2lkZSc7XG5leHBvcnQgKiBmcm9tICcuL2dldC1zaWRlJztcbmV4cG9ydCAqIGZyb20gJy4vZ2V0LXVuaXF1ZS1pZCc7XG5leHBvcnQgKiBmcm9tICcuL21hdGNoLXVybCc7XG5leHBvcnQgKiBmcm9tICcuL25nLWNoYW5nZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9wcm92aWRlLWNvbmZpZyc7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXVlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZS1ndWFyZHMnO1xuZXhwb3J0ICogZnJvbSAnLi91bnRpbC1kZXN0cm95ZWQnO1xuIl19
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvdXRpbHMvc3JjL2xpYi9oZWxwZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsT0FBTyxDQUFDO0FBQ3RCLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLFNBQVMsQ0FBQztBQUN4QixjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hbmd1bGFyJztcbmV4cG9ydCAqIGZyb20gJy4vYW5pbWF0aW9ucy1oYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vYXJyYXknO1xuZXhwb3J0ICogZnJvbSAnLi9idWlsZC11cmwnO1xuZXhwb3J0ICogZnJvbSAnLi9idWlsZC13ZWJzaXRlLXVybCc7XG5leHBvcnQgKiBmcm9tICcuL2NhY2hlLXN0b3JhZ2UtY2xpZW50JztcbmV4cG9ydCAqIGZyb20gJy4vY29lcmNpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9kZWJvdW5jZSc7XG5leHBvcnQgKiBmcm9tICcuL2RlZmVyLWZuJztcbmV4cG9ydCAqIGZyb20gJy4vZG9tJztcbmV4cG9ydCAqIGZyb20gJy4vZXZlbnQtbWFuYWdlcic7XG5leHBvcnQgKiBmcm9tICcuL2dldC1heGlzJztcbmV4cG9ydCAqIGZyb20gJy4vZ2V0LWxhbmd1YWdlLWNvZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9nZXQtb3Bwb3NpdGUtc2lkZSc7XG5leHBvcnQgKiBmcm9tICcuL2dldC1zaWRlJztcbmV4cG9ydCAqIGZyb20gJy4vZ2V0LXVuaXF1ZS1pZCc7XG5leHBvcnQgKiBmcm9tICcuL21hdGNoLXVybCc7XG5leHBvcnQgKiBmcm9tICcuL25nLWNoYW5nZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9wcm92aWRlLWNvbmZpZyc7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXVlJztcbmV4cG9ydCAqIGZyb20gJy4vc29ydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZS1ndWFyZHMnO1xuZXhwb3J0ICogZnJvbSAnLi91bnRpbC1kZXN0cm95ZWQnO1xuIl19
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Constant object representing the available sort directions.
3
+ * @property {string} ASC - Sort in ascending order.
4
+ * @property {string} DESC - Sort in descending order.
5
+ * @readonly
6
+ */
7
+ export const SortDirection = {
8
+ ASC: 'asc',
9
+ DESC: 'desc',
10
+ };
11
+ /**
12
+ * Handles comparison for null values, assuming undefined has already been handled.
13
+ * - `null` is considered less than any defined (non-null, non-undefined) value.
14
+ * @param valA First value.
15
+ * @param valB Second value.
16
+ * @returns Comparison result (-1, 0, 1) or null if both values are non-null.
17
+ */
18
+ function handleNullValues(valA, valB) {
19
+ const aIsNull = valA === null;
20
+ const bIsNull = valB === null;
21
+ if (aIsNull && bIsNull)
22
+ return 0;
23
+ if (aIsNull)
24
+ return -1; // valA is null, valB is not -> valA is "lesser"
25
+ if (bIsNull)
26
+ return 1; // valB is null, valA is not -> valA is "greater"
27
+ return null; // Both are non-null (and non-undefined at this stage of the main sorter)
28
+ }
29
+ function compareNonNullValues(valA, valB, collator) {
30
+ if (typeof valA === 'string' && typeof valB === 'string') {
31
+ return collator.compare(valA, valB);
32
+ }
33
+ else if (typeof valA === 'number' && typeof valB === 'number') {
34
+ return valA - valB;
35
+ }
36
+ else if (typeof valA === 'boolean' && typeof valB === 'boolean') {
37
+ return Number(valA) - Number(valB);
38
+ }
39
+ return collator.compare(String(valA), String(valB));
40
+ }
41
+ /**
42
+ * Creates a comparison function suitable for Array.prototype.sort(),
43
+ * based on the provided sort parameters.
44
+ * Uses Intl.Collator for string comparison.
45
+ * Can sort arrays of objects by an extracted value (via `keyFn`) or arrays of primitives directly.
46
+ *
47
+ * Behavior for `null` and `undefined` values (either direct or returned by `keyFn`):
48
+ * - `undefined` values are **always** sorted to the end of the array, regardless of the sort direction.
49
+ * - `null` values are sorted to the beginning of the array for ASC sort.
50
+ * - For DESC sort, `null` values are sorted to the end of the array, but before any `undefined` values.
51
+ *
52
+ * @template T The type of items in the array.
53
+ * @param options Optional sorting options. If `keyFn` is not provided, items are compared directly.
54
+ * @returns A comparison function `(a: T, b: T) => number`.
55
+ */
56
+ export function createSorter(options) {
57
+ const { keyFn: userProvidedKeyFn, sortDirection, locale, collatorOptions } = options || {};
58
+ if (!sortDirection || !Object.values(SortDirection).includes(sortDirection))
59
+ return () => 0;
60
+ if (userProvidedKeyFn !== undefined && typeof userProvidedKeyFn !== 'function') {
61
+ console.warn('createSorter: provided keyFn is not a function. Returning a no-op sorter.');
62
+ return () => 0;
63
+ }
64
+ // Default keyFn extracts the item itself, suitable for primitives or if T is the sortable value.
65
+ const keyFn = userProvidedKeyFn ?? ((item) => item);
66
+ const collator = new Intl.Collator(locale, collatorOptions);
67
+ return (itemA, itemB) => {
68
+ const valA = keyFn(itemA);
69
+ const valB = keyFn(itemB);
70
+ const aIsUndefined = valA === undefined;
71
+ const bIsUndefined = valB === undefined;
72
+ if (aIsUndefined && bIsUndefined)
73
+ return 0;
74
+ if (aIsUndefined)
75
+ return 1;
76
+ if (bIsUndefined)
77
+ return -1;
78
+ let comparison = 0;
79
+ const nullComparison = handleNullValues(valA, valB);
80
+ if (nullComparison !== null) {
81
+ comparison = nullComparison;
82
+ }
83
+ else {
84
+ comparison = compareNonNullValues(valA, // valA is known to be not null/undefined here
85
+ valB, // valB is known to be not null/undefined here
86
+ collator);
87
+ }
88
+ return sortDirection === SortDirection.DESC ? comparison * -1 : comparison;
89
+ };
90
+ }
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL3V0aWxzL3NyYy9saWIvaGVscGVycy9zb3J0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMkJBOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHO0lBQzNCLEdBQUcsRUFBRSxLQUFLO0lBQ1YsSUFBSSxFQUFFLE1BQU07Q0FDSixDQUFDO0FBRVg7Ozs7OztHQU1HO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBSSxJQUFPLEVBQUUsSUFBTztJQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssSUFBSSxDQUFDO0lBQzlCLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxJQUFJLENBQUM7SUFFOUIsSUFBSSxPQUFPLElBQUksT0FBTztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLElBQUksT0FBTztRQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxnREFBZ0Q7SUFDeEUsSUFBSSxPQUFPO1FBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxpREFBaUQ7SUFFeEUsT0FBTyxJQUFJLENBQUMsQ0FBQyx5RUFBeUU7QUFDeEYsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUksSUFBb0IsRUFBRSxJQUFvQixFQUFFLFFBQXVCO0lBQ2xHLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3pELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQztTQUFNLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2hFLE9BQU8sSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO1NBQU0sSUFBSSxPQUFPLElBQUksS0FBSyxTQUFTLElBQUksT0FBTyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDbEUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUksT0FBMEI7SUFDeEQsTUFBTSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFFM0YsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUFFLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTVGLElBQUksaUJBQWlCLEtBQUssU0FBUyxJQUFJLE9BQU8saUJBQWlCLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDL0UsT0FBTyxDQUFDLElBQUksQ0FBQywyRUFBMkUsQ0FBQyxDQUFDO1FBQzFGLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxpR0FBaUc7SUFDakcsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLElBQUksQ0FBQyxDQUFDLElBQU8sRUFBRSxFQUFFLENBQUMsSUFBK0QsQ0FBQyxDQUFDO0lBQ2xILE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFNUQsT0FBTyxDQUFDLEtBQVEsRUFBRSxLQUFRLEVBQVUsRUFBRTtRQUNwQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTFCLE1BQU0sWUFBWSxHQUFHLElBQUksS0FBSyxTQUFTLENBQUM7UUFDeEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxLQUFLLFNBQVMsQ0FBQztRQUV4QyxJQUFJLFlBQVksSUFBSSxZQUFZO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0MsSUFBSSxZQUFZO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0IsSUFBSSxZQUFZO1lBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUU1QixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDbkIsTUFBTSxjQUFjLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXBELElBQUksY0FBYyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzVCLFVBQVUsR0FBRyxjQUFjLENBQUM7UUFDOUIsQ0FBQzthQUFNLENBQUM7WUFDTixVQUFVLEdBQUcsb0JBQW9CLENBQy9CLElBQThDLEVBQUUsOENBQThDO1lBQzlGLElBQThDLEVBQUUsOENBQThDO1lBQzlGLFFBQVEsQ0FDVCxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sYUFBYSxLQUFLLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0lBQzdFLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGEgc29ydGVyIGZ1bmN0aW9uLiBDYW4gYmUgdXNlZCBmb3IgYXJyYXlzIG9mIG9iamVjdHMgKHdpdGggYGtleUZuYClcbiAqIG9yIGFycmF5cyBvZiBwcmltaXRpdmVzIChpZiBga2V5Rm5gIGlzIG9taXR0ZWQpLlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgaXRlbXMgdG8gYmUgc29ydGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRlck9wdGlvbnM8VD4ge1xuICBzb3J0RGlyZWN0aW9uPzogU29ydERpcmVjdGlvbjtcbiAgbG9jYWxlPzogc3RyaW5nO1xuICBjb2xsYXRvck9wdGlvbnM/OiBJbnRsLkNvbGxhdG9yT3B0aW9ucztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlIHNvcnRhYmxlIHZhbHVlIGZyb20gYW4gaXRlbS5cbiAgICogSWYgbm90IHByb3ZpZGVkLCB0aGUgaXRlbSBpdHNlbGYgaXMgdXNlZCBmb3IgY29tcGFyaXNvbiAoc3VpdGFibGUgZm9yIGFycmF5cyBvZiBwcmltaXRpdmVzKS5cbiAgICogVGhlIGV4dHJhY3RlZCB2YWx1ZSBzaG91bGQgYmUgYSBzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwgbnVsbCwgb3IgdW5kZWZpbmVkLlxuICAgKiBAZGVmYXVsdCAoaXRlbTogVCkgPT4gaXRlbVxuICAgKi9cbiAga2V5Rm4/OiAoaXRlbTogVCkgPT4gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcG9zc2libGUgZGlyZWN0aW9ucyBmb3Igc29ydGluZy5cbiAqIEl0IGlzIHVzZWQgdG8gc3BlY2lmeSBob3cgZWxlbWVudHMgc2hvdWxkIGJlIG9yZGVyZWQuXG4gKlxuICogLSBgQVNDYDogUmVwcmVzZW50cyBcImFzY2VuZGluZ1wiIG9yZGVyIChlLmcuLCBBIHRvIFosIDEgdG8gMTApLlxuICogLSBgREVTQ2A6IFJlcHJlc2VudHMgXCJkZXNjZW5kaW5nXCIgb3JkZXIgKGUuZy4sIFogdG8gQSwgMTAgdG8gMSkuXG4gKi9cbmV4cG9ydCB0eXBlIFNvcnREaXJlY3Rpb24gPSAodHlwZW9mIFNvcnREaXJlY3Rpb24pW2tleW9mIHR5cGVvZiBTb3J0RGlyZWN0aW9uXTtcblxuLyoqXG4gKiBDb25zdGFudCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBhdmFpbGFibGUgc29ydCBkaXJlY3Rpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IEFTQyAtIFNvcnQgaW4gYXNjZW5kaW5nIG9yZGVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IERFU0MgLSBTb3J0IGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gKiBAcmVhZG9ubHlcbiAqL1xuZXhwb3J0IGNvbnN0IFNvcnREaXJlY3Rpb24gPSB7XG4gIEFTQzogJ2FzYycsXG4gIERFU0M6ICdkZXNjJyxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogSGFuZGxlcyBjb21wYXJpc29uIGZvciBudWxsIHZhbHVlcywgYXNzdW1pbmcgdW5kZWZpbmVkIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZC5cbiAqIC0gYG51bGxgIGlzIGNvbnNpZGVyZWQgbGVzcyB0aGFuIGFueSBkZWZpbmVkIChub24tbnVsbCwgbm9uLXVuZGVmaW5lZCkgdmFsdWUuXG4gKiBAcGFyYW0gdmFsQSBGaXJzdCB2YWx1ZS5cbiAqIEBwYXJhbSB2YWxCIFNlY29uZCB2YWx1ZS5cbiAqIEByZXR1cm5zIENvbXBhcmlzb24gcmVzdWx0ICgtMSwgMCwgMSkgb3IgbnVsbCBpZiBib3RoIHZhbHVlcyBhcmUgbm9uLW51bGwuXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZU51bGxWYWx1ZXM8Vj4odmFsQTogViwgdmFsQjogVik6IG51bWJlciB8IG51bGwge1xuICBjb25zdCBhSXNOdWxsID0gdmFsQSA9PT0gbnVsbDtcbiAgY29uc3QgYklzTnVsbCA9IHZhbEIgPT09IG51bGw7XG5cbiAgaWYgKGFJc051bGwgJiYgYklzTnVsbCkgcmV0dXJuIDA7XG4gIGlmIChhSXNOdWxsKSByZXR1cm4gLTE7IC8vIHZhbEEgaXMgbnVsbCwgdmFsQiBpcyBub3QgLT4gdmFsQSBpcyBcImxlc3NlclwiXG4gIGlmIChiSXNOdWxsKSByZXR1cm4gMTsgLy8gdmFsQiBpcyBudWxsLCB2YWxBIGlzIG5vdCAtPiB2YWxBIGlzIFwiZ3JlYXRlclwiXG5cbiAgcmV0dXJuIG51bGw7IC8vIEJvdGggYXJlIG5vbi1udWxsIChhbmQgbm9uLXVuZGVmaW5lZCBhdCB0aGlzIHN0YWdlIG9mIHRoZSBtYWluIHNvcnRlcilcbn1cblxuZnVuY3Rpb24gY29tcGFyZU5vbk51bGxWYWx1ZXM8Vj4odmFsQTogTm9uTnVsbGFibGU8Vj4sIHZhbEI6IE5vbk51bGxhYmxlPFY+LCBjb2xsYXRvcjogSW50bC5Db2xsYXRvcik6IG51bWJlciB7XG4gIGlmICh0eXBlb2YgdmFsQSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbEIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUodmFsQSwgdmFsQik7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbEEgPT09ICdudW1iZXInICYmIHR5cGVvZiB2YWxCID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWxBIC0gdmFsQjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsQSA9PT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiB2YWxCID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbEEpIC0gTnVtYmVyKHZhbEIpO1xuICB9XG4gIHJldHVybiBjb2xsYXRvci5jb21wYXJlKFN0cmluZyh2YWxBKSwgU3RyaW5nKHZhbEIpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY29tcGFyaXNvbiBmdW5jdGlvbiBzdWl0YWJsZSBmb3IgQXJyYXkucHJvdG90eXBlLnNvcnQoKSxcbiAqIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBzb3J0IHBhcmFtZXRlcnMuXG4gKiBVc2VzIEludGwuQ29sbGF0b3IgZm9yIHN0cmluZyBjb21wYXJpc29uLlxuICogQ2FuIHNvcnQgYXJyYXlzIG9mIG9iamVjdHMgYnkgYW4gZXh0cmFjdGVkIHZhbHVlICh2aWEgYGtleUZuYCkgb3IgYXJyYXlzIG9mIHByaW1pdGl2ZXMgZGlyZWN0bHkuXG4gKlxuICogQmVoYXZpb3IgZm9yIGBudWxsYCBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzIChlaXRoZXIgZGlyZWN0IG9yIHJldHVybmVkIGJ5IGBrZXlGbmApOlxuICogLSBgdW5kZWZpbmVkYCB2YWx1ZXMgYXJlICoqYWx3YXlzKiogc29ydGVkIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LCByZWdhcmRsZXNzIG9mIHRoZSBzb3J0IGRpcmVjdGlvbi5cbiAqIC0gYG51bGxgIHZhbHVlcyBhcmUgc29ydGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IGZvciBBU0Mgc29ydC5cbiAqIC0gRm9yIERFU0Mgc29ydCwgYG51bGxgIHZhbHVlcyBhcmUgc29ydGVkIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LCBidXQgYmVmb3JlIGFueSBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgaXRlbXMgaW4gdGhlIGFycmF5LlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgc29ydGluZyBvcHRpb25zLiBJZiBga2V5Rm5gIGlzIG5vdCBwcm92aWRlZCwgaXRlbXMgYXJlIGNvbXBhcmVkIGRpcmVjdGx5LlxuICogQHJldHVybnMgQSBjb21wYXJpc29uIGZ1bmN0aW9uIGAoYTogVCwgYjogVCkgPT4gbnVtYmVyYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNvcnRlcjxUPihvcHRpb25zPzogU29ydGVyT3B0aW9uczxUPik6IChhOiBULCBiOiBUKSA9PiBudW1iZXIge1xuICBjb25zdCB7IGtleUZuOiB1c2VyUHJvdmlkZWRLZXlGbiwgc29ydERpcmVjdGlvbiwgbG9jYWxlLCBjb2xsYXRvck9wdGlvbnMgfSA9IG9wdGlvbnMgfHwge307XG5cbiAgaWYgKCFzb3J0RGlyZWN0aW9uIHx8ICFPYmplY3QudmFsdWVzKFNvcnREaXJlY3Rpb24pLmluY2x1ZGVzKHNvcnREaXJlY3Rpb24pKSByZXR1cm4gKCkgPT4gMDtcblxuICBpZiAodXNlclByb3ZpZGVkS2V5Rm4gIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdXNlclByb3ZpZGVkS2V5Rm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLndhcm4oJ2NyZWF0ZVNvcnRlcjogcHJvdmlkZWQga2V5Rm4gaXMgbm90IGEgZnVuY3Rpb24uIFJldHVybmluZyBhIG5vLW9wIHNvcnRlci4nKTtcbiAgICByZXR1cm4gKCkgPT4gMDtcbiAgfVxuXG4gIC8vIERlZmF1bHQga2V5Rm4gZXh0cmFjdHMgdGhlIGl0ZW0gaXRzZWxmLCBzdWl0YWJsZSBmb3IgcHJpbWl0aXZlcyBvciBpZiBUIGlzIHRoZSBzb3J0YWJsZSB2YWx1ZS5cbiAgY29uc3Qga2V5Rm4gPSB1c2VyUHJvdmlkZWRLZXlGbiA/PyAoKGl0ZW06IFQpID0+IGl0ZW0gYXMgdW5rbm93biBhcyBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbGxhdG9yID0gbmV3IEludGwuQ29sbGF0b3IobG9jYWxlLCBjb2xsYXRvck9wdGlvbnMpO1xuXG4gIHJldHVybiAoaXRlbUE6IFQsIGl0ZW1COiBUKTogbnVtYmVyID0+IHtcbiAgICBjb25zdCB2YWxBID0ga2V5Rm4oaXRlbUEpO1xuICAgIGNvbnN0IHZhbEIgPSBrZXlGbihpdGVtQik7XG5cbiAgICBjb25zdCBhSXNVbmRlZmluZWQgPSB2YWxBID09PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgYklzVW5kZWZpbmVkID0gdmFsQiA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGFJc1VuZGVmaW5lZCAmJiBiSXNVbmRlZmluZWQpIHJldHVybiAwO1xuICAgIGlmIChhSXNVbmRlZmluZWQpIHJldHVybiAxO1xuICAgIGlmIChiSXNVbmRlZmluZWQpIHJldHVybiAtMTtcblxuICAgIGxldCBjb21wYXJpc29uID0gMDtcbiAgICBjb25zdCBudWxsQ29tcGFyaXNvbiA9IGhhbmRsZU51bGxWYWx1ZXModmFsQSwgdmFsQik7XG5cbiAgICBpZiAobnVsbENvbXBhcmlzb24gIT09IG51bGwpIHtcbiAgICAgIGNvbXBhcmlzb24gPSBudWxsQ29tcGFyaXNvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcGFyaXNvbiA9IGNvbXBhcmVOb25OdWxsVmFsdWVzKFxuICAgICAgICB2YWxBIGFzIE5vbk51bGxhYmxlPHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+LCAvLyB2YWxBIGlzIGtub3duIHRvIGJlIG5vdCBudWxsL3VuZGVmaW5lZCBoZXJlXG4gICAgICAgIHZhbEIgYXMgTm9uTnVsbGFibGU8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4sIC8vIHZhbEIgaXMga25vd24gdG8gYmUgbm90IG51bGwvdW5kZWZpbmVkIGhlcmVcbiAgICAgICAgY29sbGF0b3IsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBzb3J0RGlyZWN0aW9uID09PSBTb3J0RGlyZWN0aW9uLkRFU0MgPyBjb21wYXJpc29uICogLTEgOiBjb21wYXJpc29uO1xuICB9O1xufVxuIl19
@@ -1,6 +1,7 @@
1
1
  import { NgTemplateOutlet } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
3
  import { inject, TemplateRef, Directive, contentChild, input, contentChildren, computed, Component, ChangeDetectionStrategy, ViewEncapsulation, NgModule } from '@angular/core';
4
+ export { SortDirection } from '@odx/angular/utils';
4
5
  import { CoreModule } from '@odx/angular';
5
6
 
6
7
  class CellDef {
@@ -97,17 +98,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
97
98
  args: [{ selector: 'odx-table-empty', standalone: true }]
98
99
  }] });
99
100
 
100
- const SortDirection = {
101
- UNSORTED: 'unsorted',
102
- ASC: 'asc',
103
- DESC: 'desc',
104
- };
105
-
106
101
  const TableVariant = {
107
102
  DEFAULT: 'default',
108
103
  STRIPED: 'striped',
109
104
  };
110
105
 
106
+ /**
107
+ * @deprecated Use `SortDirection` from `@odx/angular/utils` directly instead.
108
+ * Will be removed in a future version.
109
+ *
110
+ * ```typescript
111
+ * // Instead of:
112
+ * // import { SortDirection } from '@odx/angular/components/data-table';
113
+ *
114
+ * // Use:
115
+ * import { SortDirection } from '@odx/angular/utils';
116
+ * ```
117
+ */
118
+
111
119
  /**
112
120
  * DataTableComponent is a dynamic table structure built for displaying content.
113
121
  */
@@ -172,5 +180,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
172
180
  * Generated bundle index. Do not edit.
173
181
  */
174
182
 
175
- export { CellDef, CellDirective, ColumnDef, DataTableComponent, DataTableModule, HeaderCellDef, HeaderCellDirective, SortDirection, TableEmptyDirective, TableVariant };
183
+ export { CellDef, CellDirective, ColumnDef, DataTableComponent, DataTableModule, HeaderCellDef, HeaderCellDirective, TableEmptyDirective, TableVariant };
176
184
  //# sourceMappingURL=odx-angular-components-data-table.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"odx-angular-components-data-table.mjs","sources":["../../../../libs/angular/components/data-table/src/lib/directives/cell-def.directive.ts","../../../../libs/angular/components/data-table/src/lib/directives/cell.directive.ts","../../../../libs/angular/components/data-table/src/lib/directives/header-cell-def.directive.ts","../../../../libs/angular/components/data-table/src/lib/directives/column-def.directive.ts","../../../../libs/angular/components/data-table/src/lib/directives/header-cell.directive.ts","../../../../libs/angular/components/data-table/src/lib/directives/table-empty.directive.ts","../../../../libs/angular/components/data-table/src/lib/models/sort-direction.ts","../../../../libs/angular/components/data-table/src/lib/models/table-variant.ts","../../../../libs/angular/components/data-table/src/lib/data-table.component.ts","../../../../libs/angular/components/data-table/src/lib/data-table.component.html","../../../../libs/angular/components/data-table/src/lib/data-table.module.ts","../../../../libs/angular/components/data-table/src/odx-angular-components-data-table.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: '[odxCellDef]',\n standalone: true,\n})\nexport class CellDef {\n public template = inject(TemplateRef);\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: 'td[odxCell]',\n standalone: true,\n host: {\n role: 'cell',\n class: 'odx-table__cell',\n },\n})\nexport class CellDirective {}\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: '[odxHeaderCellDef]',\n standalone: true,\n})\nexport class HeaderCellDef {\n public template = inject(TemplateRef);\n}\n","import { contentChild, Directive, input, TemplateRef } from '@angular/core';\nimport { CellDef } from './cell-def.directive';\nimport { HeaderCellDef } from './header-cell-def.directive';\n\n@Directive({\n selector: '[odxColumnDef]',\n standalone: true,\n})\nexport class ColumnDef {\n private readonly headerCellDef = contentChild.required(HeaderCellDef);\n private readonly cellDef = contentChild.required(CellDef);\n\n public name = input.required<string>({ alias: 'odxColumnDef' });\n\n public getHeaderTemplate(): TemplateRef<unknown> | null {\n return this.headerCellDef().template ?? null;\n }\n\n public getCellTemplate(): TemplateRef<unknown> | null {\n return this.cellDef().template ?? null;\n }\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: 'th[odxHeaderCell]',\n standalone: true,\n host: {\n role: 'columnheader',\n class: 'odx-table__header-cell odx-data-table__header-cell',\n },\n})\nexport class HeaderCellDirective {}\n","import { Directive } from '@angular/core';\n\n@Directive({ selector: 'odx-table-empty', standalone: true })\nexport class TableEmptyDirective {}\n","export type SortDirection = (typeof SortDirection)[keyof typeof SortDirection];\n\nexport const SortDirection = {\n UNSORTED: 'unsorted',\n ASC: 'asc',\n DESC: 'desc',\n} as const;\n","export type TableVariant = typeof TableVariant[keyof typeof TableVariant];\n\nexport const TableVariant = {\n DEFAULT: 'default',\n STRIPED: 'striped',\n} as const;\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, contentChildren, input, Signal, ViewEncapsulation } from '@angular/core';\nimport { ColumnDef } from './directives';\nimport { TableVariant } from './models';\n\n/**\n * DataTableComponent is a dynamic table structure built for displaying content.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'table[odxDataTable]',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n role: 'table',\n '[class]': 'classList()',\n },\n templateUrl: './data-table.component.html',\n imports: [NgTemplateOutlet],\n})\nexport class DataTableComponent<T = unknown> {\n protected columnDefs = contentChildren(ColumnDef, { descendants: true });\n\n protected orderedColumns = computed(() => {\n const cols = this.columnDefs() ?? [];\n const displayedCols = this.displayedColumns() ?? [];\n\n return displayedCols.length > 0\n ? displayedCols.map((colName) => cols.find((colDef) => colDef.name() === colName)).filter((colDef): colDef is ColumnDef => !!colDef)\n : cols;\n });\n\n /**\n * The data to be displayed in the table.\n * @required\n * @type {T[]}\n */\n public dataSource = input.required<T[]>();\n\n /**\n * The columns to be displayed in the table.\n * @required\n * @type {string[]}\n */\n public displayedColumns = input.required<string[]>();\n\n /**\n * The variant of the table.\n * @default TableVariant.DEFAULT\n * @type {TableVariant}\n */\n public variant = input<TableVariant>(TableVariant.DEFAULT);\n\n protected get classList(): Signal<string> {\n return computed(() => `odx-table odx-data-table odx-table--${this.variant()}`);\n }\n}\n","<thead role=\"rowgroup\" class=\"odx-table__head\">\n <tr role=\"row\" class=\"odx-table__header-row\">\n @for (col of orderedColumns(); track col.name) {\n <ng-container *ngTemplateOutlet=\"col.getHeaderTemplate()\" />\n }\n </tr>\n</thead>\n<tbody role=\"rowgroup\" class=\"odx-table__body\">\n @for (item of dataSource(); track item) {\n <tr class=\"odx-table__row\" role=\"row\">\n @for (col of orderedColumns(); track col.name) {\n <ng-container *ngTemplateOutlet=\"col.getCellTemplate(); context: { $implicit: item }\" />\n }\n </tr>\n } @empty {\n <tr class=\"odx-table__row\" role=\"row\">\n <td class=\"odx-table__cell\" role=\"cell\" [attr.colspan]=\"orderedColumns().length\">\n <ng-content select=\"odx-table-empty\" />\n </td>\n </tr>\n }\n</tbody>\n","import { NgModule } from '@angular/core';\nimport { CoreModule } from '@odx/angular';\nimport { DataTableComponent } from './data-table.component';\nimport { CellDef, CellDirective, ColumnDef, HeaderCellDef, HeaderCellDirective, TableEmptyDirective } from './directives';\n\nconst modules = [DataTableComponent, CellDef, ColumnDef, HeaderCellDef, TableEmptyDirective, CellDirective, HeaderCellDirective];\n\n@NgModule({\n imports: modules,\n exports: [CoreModule, ...modules],\n})\nexport class DataTableModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"odx-angular-components-data-table.mjs","sources":["../../../../libs/angular/components/data-table/src/lib/directives/cell-def.directive.ts","../../../../libs/angular/components/data-table/src/lib/directives/cell.directive.ts","../../../../libs/angular/components/data-table/src/lib/directives/header-cell-def.directive.ts","../../../../libs/angular/components/data-table/src/lib/directives/column-def.directive.ts","../../../../libs/angular/components/data-table/src/lib/directives/header-cell.directive.ts","../../../../libs/angular/components/data-table/src/lib/directives/table-empty.directive.ts","../../../../libs/angular/components/data-table/src/lib/models/table-variant.ts","../../../../libs/angular/components/data-table/src/lib/models/index.ts","../../../../libs/angular/components/data-table/src/lib/data-table.component.ts","../../../../libs/angular/components/data-table/src/lib/data-table.component.html","../../../../libs/angular/components/data-table/src/lib/data-table.module.ts","../../../../libs/angular/components/data-table/src/odx-angular-components-data-table.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: '[odxCellDef]',\n standalone: true,\n})\nexport class CellDef {\n public template = inject(TemplateRef);\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: 'td[odxCell]',\n standalone: true,\n host: {\n role: 'cell',\n class: 'odx-table__cell',\n },\n})\nexport class CellDirective {}\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: '[odxHeaderCellDef]',\n standalone: true,\n})\nexport class HeaderCellDef {\n public template = inject(TemplateRef);\n}\n","import { contentChild, Directive, input, TemplateRef } from '@angular/core';\nimport { CellDef } from './cell-def.directive';\nimport { HeaderCellDef } from './header-cell-def.directive';\n\n@Directive({\n selector: '[odxColumnDef]',\n standalone: true,\n})\nexport class ColumnDef {\n private readonly headerCellDef = contentChild.required(HeaderCellDef);\n private readonly cellDef = contentChild.required(CellDef);\n\n public name = input.required<string>({ alias: 'odxColumnDef' });\n\n public getHeaderTemplate(): TemplateRef<unknown> | null {\n return this.headerCellDef().template ?? null;\n }\n\n public getCellTemplate(): TemplateRef<unknown> | null {\n return this.cellDef().template ?? null;\n }\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: 'th[odxHeaderCell]',\n standalone: true,\n host: {\n role: 'columnheader',\n class: 'odx-table__header-cell odx-data-table__header-cell',\n },\n})\nexport class HeaderCellDirective {}\n","import { Directive } from '@angular/core';\n\n@Directive({ selector: 'odx-table-empty', standalone: true })\nexport class TableEmptyDirective {}\n","export type TableVariant = typeof TableVariant[keyof typeof TableVariant];\n\nexport const TableVariant = {\n DEFAULT: 'default',\n STRIPED: 'striped',\n} as const;\n","export { SortStatus as SortState } from '@odx/angular/components/table';\n\n/**\n * @deprecated Use `SortDirection` from `@odx/angular/utils` directly instead.\n * Will be removed in a future version.\n *\n * ```typescript\n * // Instead of:\n * // import { SortDirection } from '@odx/angular/components/data-table';\n *\n * // Use:\n * import { SortDirection } from '@odx/angular/utils';\n * ```\n */\nexport { SortDirection } from '@odx/angular/utils';\nexport * from './table-variant';\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, contentChildren, input, Signal, ViewEncapsulation } from '@angular/core';\nimport { ColumnDef } from './directives';\nimport { TableVariant } from './models';\n\n/**\n * DataTableComponent is a dynamic table structure built for displaying content.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'table[odxDataTable]',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n role: 'table',\n '[class]': 'classList()',\n },\n templateUrl: './data-table.component.html',\n imports: [NgTemplateOutlet],\n})\nexport class DataTableComponent<T = unknown> {\n protected columnDefs = contentChildren(ColumnDef, { descendants: true });\n\n protected orderedColumns = computed(() => {\n const cols = this.columnDefs() ?? [];\n const displayedCols = this.displayedColumns() ?? [];\n\n return displayedCols.length > 0\n ? displayedCols.map((colName) => cols.find((colDef) => colDef.name() === colName)).filter((colDef): colDef is ColumnDef => !!colDef)\n : cols;\n });\n\n /**\n * The data to be displayed in the table.\n * @required\n * @type {T[]}\n */\n public dataSource = input.required<T[]>();\n\n /**\n * The columns to be displayed in the table.\n * @required\n * @type {string[]}\n */\n public displayedColumns = input.required<string[]>();\n\n /**\n * The variant of the table.\n * @default TableVariant.DEFAULT\n * @type {TableVariant}\n */\n public variant = input<TableVariant>(TableVariant.DEFAULT);\n\n protected get classList(): Signal<string> {\n return computed(() => `odx-table odx-data-table odx-table--${this.variant()}`);\n }\n}\n","<thead role=\"rowgroup\" class=\"odx-table__head\">\n <tr role=\"row\" class=\"odx-table__header-row\">\n @for (col of orderedColumns(); track col.name) {\n <ng-container *ngTemplateOutlet=\"col.getHeaderTemplate()\" />\n }\n </tr>\n</thead>\n<tbody role=\"rowgroup\" class=\"odx-table__body\">\n @for (item of dataSource(); track item) {\n <tr class=\"odx-table__row\" role=\"row\">\n @for (col of orderedColumns(); track col.name) {\n <ng-container *ngTemplateOutlet=\"col.getCellTemplate(); context: { $implicit: item }\" />\n }\n </tr>\n } @empty {\n <tr class=\"odx-table__row\" role=\"row\">\n <td class=\"odx-table__cell\" role=\"cell\" [attr.colspan]=\"orderedColumns().length\">\n <ng-content select=\"odx-table-empty\" />\n </td>\n </tr>\n }\n</tbody>\n","import { NgModule } from '@angular/core';\nimport { CoreModule } from '@odx/angular';\nimport { DataTableComponent } from './data-table.component';\nimport { CellDef, CellDirective, ColumnDef, HeaderCellDef, HeaderCellDirective, TableEmptyDirective } from './directives';\n\nconst modules = [DataTableComponent, CellDef, ColumnDef, HeaderCellDef, TableEmptyDirective, CellDirective, HeaderCellDirective];\n\n@NgModule({\n imports: modules,\n exports: [CoreModule, ...modules],\n})\nexport class DataTableModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}