@mediusinc/mng-commons 4.1.0-rc.0 → 5.0.0-rc.0-c31d5206
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/assets/i18n/en.json +13 -66
- package/assets/i18n/sl.json +12 -67
- package/data-api/README.md +3 -0
- package/data-api/class-dto/README.md +3 -0
- package/data-api/class-dto/helpers/tableview-crud-create.d.ts +40 -0
- package/data-api/class-dto/index.d.ts +7 -0
- package/data-api/class-dto/models/query-result.model.d.ts +13 -0
- package/data-api/class-dto/obsolete/README.md +3 -0
- package/data-api/class-dto/obsolete/helpers/query-param-convert.d.ts +23 -0
- package/data-api/class-dto/obsolete/helpers/tableview-crud-create.d.ts +22 -0
- package/data-api/class-dto/obsolete/index.d.ts +14 -0
- package/data-api/class-dto/obsolete/models/builders/query-param.builder.d.ts +36 -0
- package/{lib/api → data-api/class-dto/obsolete}/models/filter-param.model.d.ts +1 -1
- package/{lib/api → data-api/class-dto/obsolete}/models/query-param.model.d.ts +1 -1
- package/{lib/api → data-api/class-dto/obsolete}/models/query-result.model.d.ts +1 -1
- package/data-api/class-dto/obsolete/provide.d.ts +9 -0
- package/data-api/class-dto/obsolete/services/api.abstract.service.d.ts +36 -0
- package/{lib/api → data-api/class-dto/obsolete}/services/crud-api.abstract.service.d.ts +20 -5
- package/data-api/class-dto/obsolete/services/get-all-api.abstract.service.d.ts +30 -0
- package/data-api/class-dto/obsolete/tableview/tableview-crud.data-provider.d.ts +28 -0
- package/data-api/class-dto/obsolete/utils/query-param-map.util.d.ts +22 -0
- package/{lib/api/utils/object-serializer.util.d.ts → data-api/class-dto/serder/object-serializer.d.ts} +1 -1
- package/{lib/api → data-api/class-dto}/services/api.abstract.service.d.ts +2 -4
- package/data-api/class-dto/services/crud-api.abstract.service.d.ts +25 -0
- package/data-api/class-dto/services/get-all-api.abstract.service.d.ts +14 -0
- package/data-api/class-dto/tableview/tableview-crud.data-provider.d.ts +17 -0
- package/data-api/helpers/get-all-params.d.ts +69 -0
- package/data-api/helpers/tableview-get-all-params-create.d.ts +14 -0
- package/data-api/index.d.ts +5 -0
- package/data-api/models/request-params.model.d.ts +61 -0
- package/data-api/rxjs/map-to-data-list.operator.d.ts +9 -0
- package/data-api/types/extract-get-all-params.type.d.ts +14 -0
- package/esm2022/data-api/class-dto/helpers/tableview-crud-create.mjs +40 -0
- package/esm2022/data-api/class-dto/index.mjs +13 -0
- package/esm2022/data-api/class-dto/mediusinc-mng-commons-data-api-class-dto.mjs +5 -0
- package/esm2022/data-api/class-dto/models/query-result.model.mjs +24 -0
- package/esm2022/data-api/class-dto/obsolete/helpers/query-param-convert.mjs +103 -0
- package/esm2022/data-api/class-dto/obsolete/helpers/tableview-crud-create.mjs +21 -0
- package/esm2022/data-api/class-dto/obsolete/index.mjs +21 -0
- package/esm2022/data-api/class-dto/obsolete/mediusinc-mng-commons-data-api-class-dto-obsolete.mjs +5 -0
- package/esm2022/data-api/class-dto/obsolete/models/builders/query-param.builder.mjs +83 -0
- package/esm2022/data-api/class-dto/obsolete/models/filter-match-type.model.mjs +27 -0
- package/esm2022/data-api/class-dto/obsolete/models/filter-param.model.mjs +33 -0
- package/esm2022/data-api/class-dto/obsolete/models/query-mode.model.mjs +18 -0
- package/esm2022/data-api/class-dto/obsolete/models/query-param.model.mjs +68 -0
- package/esm2022/data-api/class-dto/obsolete/models/query-result.model.mjs +24 -0
- package/esm2022/data-api/class-dto/obsolete/provide.mjs +40 -0
- package/esm2022/data-api/class-dto/obsolete/services/api.abstract.service.mjs +70 -0
- package/esm2022/data-api/class-dto/obsolete/services/crud-api.abstract.service.mjs +83 -0
- package/esm2022/data-api/class-dto/obsolete/services/get-all-api.abstract.service.mjs +38 -0
- package/esm2022/data-api/class-dto/obsolete/tableview/tableview-crud.data-provider.mjs +51 -0
- package/esm2022/data-api/class-dto/obsolete/utils/query-param-map.util.mjs +57 -0
- package/esm2022/data-api/class-dto/serder/object-serializer.mjs +184 -0
- package/esm2022/data-api/class-dto/services/api.abstract.service.mjs +55 -0
- package/esm2022/data-api/class-dto/services/crud-api.abstract.service.mjs +82 -0
- package/esm2022/data-api/class-dto/services/get-all-api.abstract.service.mjs +49 -0
- package/esm2022/data-api/class-dto/tableview/tableview-crud.data-provider.mjs +49 -0
- package/esm2022/data-api/helpers/get-all-params.mjs +180 -0
- package/esm2022/data-api/helpers/tableview-get-all-params-create.mjs +18 -0
- package/esm2022/data-api/index.mjs +10 -0
- package/esm2022/data-api/mediusinc-mng-commons-data-api.mjs +5 -0
- package/esm2022/data-api/models/request-params.model.mjs +2 -0
- package/esm2022/data-api/rxjs/map-to-data-list.operator.mjs +19 -0
- package/esm2022/data-api/types/extract-get-all-params.type.mjs +2 -0
- package/esm2022/index.mjs +3 -6
- package/esm2022/lib/components/action/action.component.mjs +4 -5
- package/esm2022/lib/components/action/editor/injector-context/action-editor-injector-context.component.mjs +2 -2
- package/esm2022/lib/components/action/models/action-execution.model.mjs +5 -4
- package/esm2022/lib/components/action/route/action-route.component.mjs +1 -2
- package/esm2022/lib/components/action/table/action-table.component.mjs +4 -6
- package/esm2022/lib/components/form/autocomplete/autocomplete.component.mjs +29 -17
- package/esm2022/lib/components/form/dropdown/dropdown.component.mjs +3 -7
- package/esm2022/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +20 -18
- package/esm2022/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +2 -2
- package/esm2022/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +23 -12
- package/esm2022/lib/components/table/column-filter-full/column-filter-full.component.mjs +162 -33
- package/esm2022/lib/components/table/column-value/column-value.component.mjs +3 -3
- package/esm2022/lib/components/table/models/table.event.mjs +1 -1
- package/esm2022/lib/components/table/models/table.interface.mjs +1 -1
- package/esm2022/lib/components/table/table-column-filter-class/table-column-filter-class.pipe.mjs +4 -4
- package/esm2022/lib/components/table/table.component.mjs +117 -191
- package/esm2022/lib/components/tableview/actions/tableview-default-actions.mjs +215 -0
- package/esm2022/lib/components/tableview/builders/tableview-builder.mjs +162 -0
- package/esm2022/lib/components/tableview/helpers/tableview-create.mjs +24 -0
- package/esm2022/lib/components/tableview/index.mjs +5 -2
- package/esm2022/lib/components/tableview/models/tableview.model.mjs +2 -0
- package/esm2022/lib/components/tableview/route/tableview-route.component.mjs +7 -39
- package/esm2022/lib/components/tableview/tableview.component.mjs +4 -4
- package/esm2022/lib/data-providers/editor.data-provider.mjs +13 -13
- package/esm2022/lib/data-providers/index.mjs +1 -2
- package/esm2022/lib/data-providers/lookup.data-provider.mjs +1 -1
- package/esm2022/lib/data-providers/table.data-provider.mjs +4 -5
- package/esm2022/lib/data-providers/tableview.data-provider.mjs +1 -1
- package/esm2022/lib/descriptors/action/action-confirmation.descriptor.mjs +1 -1
- package/esm2022/lib/descriptors/action/action-editor.descriptor.mjs +10 -6
- package/esm2022/lib/descriptors/action/action.descriptor.mjs +2 -3
- package/esm2022/lib/descriptors/editor/editor.descriptor.mjs +13 -17
- package/esm2022/lib/descriptors/editor/field-lookup.descriptor.mjs +12 -17
- package/esm2022/lib/descriptors/editor/field.descriptor.mjs +5 -8
- package/esm2022/lib/descriptors/editor/internal/editor-fields.model.mjs +1 -1
- package/esm2022/lib/descriptors/filter/filter-lookup.descriptor.mjs +28 -52
- package/esm2022/lib/descriptors/filter/filter.descriptor.mjs +40 -23
- package/esm2022/lib/descriptors/model/enum.descriptor.mjs +31 -0
- package/esm2022/lib/descriptors/model/index.mjs +3 -1
- package/esm2022/lib/descriptors/model/model.descriptor.mjs +10 -1
- package/esm2022/lib/descriptors/model/type.descriptor.mjs +11 -0
- package/esm2022/lib/descriptors/table/column.descriptor.mjs +12 -107
- package/esm2022/lib/descriptors/table/index.mjs +2 -1
- package/esm2022/lib/descriptors/table/internal/table-columns.model.mjs +1 -1
- package/esm2022/lib/descriptors/table/internal/table.model.mjs +1 -1
- package/esm2022/lib/descriptors/table/sort.descriptor.mjs +45 -0
- package/esm2022/lib/descriptors/table/table.descriptor.mjs +208 -57
- package/esm2022/lib/descriptors/tableview/internal/tableview.model.mjs +1 -1
- package/esm2022/lib/descriptors/tableview/tableview.descriptor.mjs +114 -17
- package/esm2022/lib/descriptors/types/filter.type.mjs +1 -19
- package/esm2022/lib/descriptors/types/table.type.mjs +1 -5
- package/esm2022/lib/error/error.handler.mjs +1 -1
- package/esm2022/lib/helpers/data-provider-executors.mjs +80 -0
- package/esm2022/lib/models/data-list.model.mjs +2 -0
- package/esm2022/lib/models/filter-match.model.mjs +105 -0
- package/esm2022/lib/models/index.mjs +3 -1
- package/esm2022/lib/models/view-container.model.mjs +1 -1
- package/esm2022/lib/pipes/enum.pipe.mjs +6 -6
- package/esm2022/lib/provide.mjs +101 -0
- package/esm2022/lib/registry/type.registry.mjs +3 -10
- package/esm2022/lib/router/models/router.model.mjs +1 -1
- package/esm2022/lib/router/tableview-route-builder.mjs +1 -1
- package/esm2022/lib/services/action/action-executor.service.mjs +54 -32
- package/esm2022/lib/services/commons.service.mjs +1 -37
- package/esm2022/lib/services/data-provider-executor.service.mjs +52 -0
- package/esm2022/lib/services/index.mjs +2 -1
- package/esm2022/lib/services/view/view-container.service.mjs +1 -1
- package/esm2022/lib/types/action-descriptor.types.mjs +1 -1
- package/esm2022/lib/types/type.model.mjs +1 -1
- package/esm2022/lib/utils/data-list-params.util.mjs +416 -0
- package/esm2022/lib/utils/date.util.mjs +8 -2
- package/esm2022/lib/utils/enum.util.mjs +2 -1
- package/esm2022/lib/utils/error.util.mjs +3 -3
- package/esm2022/lib/utils/export.util.mjs +1 -1
- package/esm2022/lib/utils/index.mjs +2 -2
- package/esm2022/lib/utils/route.util.mjs +1 -2
- package/fesm2022/mediusinc-mng-commons-data-api-class-dto-obsolete.mjs +698 -0
- package/fesm2022/mediusinc-mng-commons-data-api-class-dto-obsolete.mjs.map +1 -0
- package/fesm2022/mediusinc-mng-commons-data-api-class-dto.mjs +480 -0
- package/fesm2022/mediusinc-mng-commons-data-api-class-dto.mjs.map +1 -0
- package/fesm2022/mediusinc-mng-commons-data-api.mjs +224 -0
- package/fesm2022/mediusinc-mng-commons-data-api.mjs.map +1 -0
- package/fesm2022/mediusinc-mng-commons.mjs +2634 -2549
- package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
- package/index.d.ts +2 -4
- package/lib/components/action/action.component.d.ts +13 -13
- package/lib/components/action/models/action-execution.model.d.ts +47 -46
- package/lib/components/action/table/action-table.component.d.ts +15 -16
- package/lib/components/form/autocomplete/autocomplete.component.d.ts +1 -1
- package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +3 -5
- package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +10 -10
- package/lib/components/table/column-filter-full/column-filter-full.component.d.ts +25 -9
- package/lib/components/table/models/table.event.d.ts +2 -2
- package/lib/components/table/models/table.interface.d.ts +4 -1
- package/lib/components/table/table-column-filter-class/table-column-filter-class.pipe.d.ts +2 -2
- package/lib/components/table/table.component.d.ts +19 -18
- package/lib/components/tableview/actions/tableview-default-actions.d.ts +36 -0
- package/lib/components/tableview/builders/tableview-builder.d.ts +115 -0
- package/lib/components/tableview/helpers/tableview-create.d.ts +16 -0
- package/lib/components/tableview/index.d.ts +4 -1
- package/lib/components/tableview/models/tableview.model.d.ts +8 -0
- package/lib/components/tableview/route/tableview-route.component.d.ts +5 -14
- package/lib/components/tableview/tableview.component.d.ts +12 -12
- package/lib/data-providers/editor.data-provider.d.ts +12 -12
- package/lib/data-providers/index.d.ts +0 -1
- package/lib/data-providers/lookup.data-provider.d.ts +2 -2
- package/lib/data-providers/table.data-provider.d.ts +25 -25
- package/lib/data-providers/tableview.data-provider.d.ts +18 -18
- package/lib/descriptors/action/action-confirmation.descriptor.d.ts +1 -1
- package/lib/descriptors/action/action-editor.descriptor.d.ts +20 -17
- package/lib/descriptors/editor/editor.descriptor.d.ts +8 -12
- package/lib/descriptors/editor/field-base.descriptor.d.ts +3 -3
- package/lib/descriptors/editor/field-lookup.descriptor.d.ts +11 -11
- package/lib/descriptors/editor/field-many.descriptor.d.ts +4 -4
- package/lib/descriptors/editor/field.descriptor.d.ts +2 -2
- package/lib/descriptors/editor/internal/editor-fields.model.d.ts +6 -5
- package/lib/descriptors/filter/filter-lookup.descriptor.d.ts +15 -14
- package/lib/descriptors/filter/filter.descriptor.d.ts +17 -18
- package/lib/descriptors/model/enum.descriptor.d.ts +14 -0
- package/lib/descriptors/model/index.d.ts +2 -0
- package/lib/descriptors/model/model.descriptor.d.ts +9 -0
- package/lib/descriptors/model/type.descriptor.d.ts +5 -0
- package/lib/descriptors/table/column.descriptor.d.ts +10 -24
- package/lib/descriptors/table/index.d.ts +1 -0
- package/lib/descriptors/table/internal/table-columns.model.d.ts +36 -5
- package/lib/descriptors/table/internal/table.model.d.ts +5 -2
- package/lib/descriptors/table/sort.descriptor.d.ts +17 -0
- package/lib/descriptors/table/table.descriptor.d.ts +57 -33
- package/lib/descriptors/tableview/internal/tableview.model.d.ts +3 -3
- package/lib/descriptors/tableview/tableview.descriptor.d.ts +49 -19
- package/lib/descriptors/types/filter.type.d.ts +0 -17
- package/lib/descriptors/types/table.type.d.ts +0 -3
- package/lib/error/error.handler.d.ts +1 -1
- package/lib/helpers/data-provider-executors.d.ts +19 -0
- package/lib/models/data-list.model.d.ts +27 -0
- package/lib/models/filter-match.model.d.ts +36 -0
- package/lib/models/index.d.ts +2 -0
- package/lib/models/view-container.model.d.ts +2 -2
- package/lib/pipes/enum.pipe.d.ts +2 -2
- package/lib/provide.d.ts +10 -0
- package/lib/router/models/router.model.d.ts +1 -1
- package/lib/router/tableview-route-builder.d.ts +1 -2
- package/lib/services/action/action-executor.service.d.ts +18 -16
- package/lib/services/data-provider-executor.service.d.ts +60 -0
- package/lib/services/index.d.ts +1 -0
- package/lib/services/view/view-container.service.d.ts +11 -11
- package/lib/types/action-descriptor.types.d.ts +2 -2
- package/lib/types/type.model.d.ts +1 -3
- package/lib/utils/data-list-params.util.d.ts +84 -0
- package/lib/utils/date.util.d.ts +3 -1
- package/lib/utils/enum.util.d.ts +4 -3
- package/lib/utils/export.util.d.ts +1 -1
- package/lib/utils/index.d.ts +1 -1
- package/openapi/angular/modelEnum.mustache +0 -3
- package/package.json +20 -2
- package/esm2022/lib/api/models/builders/query-param.builder.mjs +0 -59
- package/esm2022/lib/api/models/filter-match-type.model.mjs +0 -27
- package/esm2022/lib/api/models/filter-param.model.mjs +0 -33
- package/esm2022/lib/api/models/index.mjs +0 -7
- package/esm2022/lib/api/models/query-mode.model.mjs +0 -18
- package/esm2022/lib/api/models/query-param.model.mjs +0 -68
- package/esm2022/lib/api/models/query-result.model.mjs +0 -35
- package/esm2022/lib/api/services/api.abstract.service.mjs +0 -58
- package/esm2022/lib/api/services/crud-api.abstract.service.mjs +0 -75
- package/esm2022/lib/api/services/get-all-api.abstract.service.mjs +0 -30
- package/esm2022/lib/api/services/index.mjs +0 -4
- package/esm2022/lib/api/utils/index.mjs +0 -3
- package/esm2022/lib/api/utils/medius-rest.util.mjs +0 -293
- package/esm2022/lib/api/utils/object-serializer.util.mjs +0 -185
- package/esm2022/lib/components/tableview/route/tableview-route.abstract.component.mjs +0 -158
- package/esm2022/lib/data-providers/tableview-crud.data-provider.mjs +0 -32
- package/esm2022/lib/provide-commons.mjs +0 -88
- package/esm2022/lib/utils/action-data-provider.util.mjs +0 -171
- package/lib/api/models/builders/query-param.builder.d.ts +0 -13
- package/lib/api/models/index.d.ts +0 -6
- package/lib/api/services/get-all-api.abstract.service.d.ts +0 -14
- package/lib/api/services/index.d.ts +0 -3
- package/lib/api/utils/index.d.ts +0 -2
- package/lib/api/utils/medius-rest.util.d.ts +0 -32
- package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +0 -35
- package/lib/data-providers/tableview-crud.data-provider.d.ts +0 -12
- package/lib/provide-commons.d.ts +0 -3
- package/lib/utils/action-data-provider.util.d.ts +0 -35
- package/templates/tableview-route.component.html +0 -5
- /package/{lib/api → data-api/class-dto/obsolete}/models/filter-match-type.model.d.ts +0 -0
- /package/{lib/api → data-api/class-dto/obsolete}/models/query-mode.model.d.ts +0 -0
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
import { FilterMatchMode } from 'primeng/api';
|
|
2
|
-
import { FilterTypeEnum } from '../../descriptors/types';
|
|
3
|
-
import { DateUtil } from '../../utils';
|
|
4
|
-
import { MediusFilterMatchType, MediusQueryParamBuilder } from '../models';
|
|
5
|
-
export class MediusRestUtil {
|
|
6
|
-
static { this._instance = new MediusRestUtil(); }
|
|
7
|
-
constructor() {
|
|
8
|
-
// first value is from primeNG, second is for use in query params
|
|
9
|
-
this.matchModeMapping = [
|
|
10
|
-
[FilterMatchMode.CONTAINS, 'c', MediusFilterMatchType.Contains, null],
|
|
11
|
-
[FilterMatchMode.ENDS_WITH, 'ew', MediusFilterMatchType.EndsWith, null],
|
|
12
|
-
[FilterMatchMode.EQUALS, 'eq', MediusFilterMatchType.Equals, null],
|
|
13
|
-
[FilterMatchMode.GREATER_THAN, 'gt', MediusFilterMatchType.GreaterThan, null],
|
|
14
|
-
[FilterMatchMode.LESS_THAN, 'lt', MediusFilterMatchType.SmallerThan, null],
|
|
15
|
-
[FilterMatchMode.STARTS_WITH, 'sw', MediusFilterMatchType.StartsWith, null],
|
|
16
|
-
[FilterMatchMode.IN, 'in', MediusFilterMatchType.In, null],
|
|
17
|
-
[FilterMatchMode.NOT_EQUALS, 'neq', MediusFilterMatchType.NotEquals, null],
|
|
18
|
-
[FilterMatchMode.BETWEEN, 'ft', MediusFilterMatchType.FromTo, FilterTypeEnum.Date],
|
|
19
|
-
[FilterMatchMode.DATE_IS, 'dteq', MediusFilterMatchType.Equals, FilterTypeEnum.Date],
|
|
20
|
-
[FilterMatchMode.DATE_BEFORE, 'lt', MediusFilterMatchType.SmallerThan, FilterTypeEnum.Date],
|
|
21
|
-
[FilterMatchMode.DATE_AFTER, 'gt', MediusFilterMatchType.GreaterThan, FilterTypeEnum.Date],
|
|
22
|
-
[FilterMatchMode.DATE_IS_NOT, 'neq', MediusFilterMatchType.NotEquals, FilterTypeEnum.Date],
|
|
23
|
-
[FilterMatchMode.IS, 'ex', MediusFilterMatchType.Exists, null],
|
|
24
|
-
[FilterMatchMode.IS_NOT, 'dne', MediusFilterMatchType.DoesNotExist, null]
|
|
25
|
-
];
|
|
26
|
-
this.dateTimeInUtc = false;
|
|
27
|
-
this.dateTimeWithTimezone = true;
|
|
28
|
-
this.dateTimeWithMillis = true;
|
|
29
|
-
this.dateOnlyDisabled = false;
|
|
30
|
-
// empty
|
|
31
|
-
}
|
|
32
|
-
static get() {
|
|
33
|
-
return MediusRestUtil._instance;
|
|
34
|
-
}
|
|
35
|
-
configure(config) {
|
|
36
|
-
if (config.dateTimeInUtc !== undefined) {
|
|
37
|
-
this.dateTimeInUtc = config.dateTimeInUtc;
|
|
38
|
-
}
|
|
39
|
-
if (config.dateTimeWithTimezone !== undefined) {
|
|
40
|
-
this.dateTimeWithTimezone = config.dateTimeWithTimezone;
|
|
41
|
-
}
|
|
42
|
-
if (config.dateTimeWithMillis !== undefined) {
|
|
43
|
-
this.dateTimeWithMillis = config.dateTimeWithMillis;
|
|
44
|
-
}
|
|
45
|
-
if (config.dateOnlyDisabled !== undefined) {
|
|
46
|
-
this.dateOnlyDisabled = config.dateOnlyDisabled;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
fromAngularQueryParamsToMediusQueryParams(params, filterDescriptors, defaultItemsPerPage = 10, defaultOffset = 0) {
|
|
50
|
-
const offset = params['first'] ? parseInt(params['first']) : defaultOffset;
|
|
51
|
-
const itemsPerPage = params['rows'] ? parseInt(params['rows']) : defaultItemsPerPage;
|
|
52
|
-
const mediusParamsBuilder = MediusQueryParamBuilder.create(itemsPerPage, offset);
|
|
53
|
-
if (params['sort']) {
|
|
54
|
-
for (const sort of params['sort'].split(',')) {
|
|
55
|
-
const qpSortSplit = sort.split(':');
|
|
56
|
-
const field = qpSortSplit[0];
|
|
57
|
-
const asc = qpSortSplit.length > 1 ? qpSortSplit[1] === 'asc' : true;
|
|
58
|
-
mediusParamsBuilder.withSort(field, asc);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
if (params['filter']) {
|
|
62
|
-
const filterSplit = params['filter'].split(';');
|
|
63
|
-
for (const filterField of filterSplit) {
|
|
64
|
-
const filterFieldSplit = filterField.split(':');
|
|
65
|
-
const field = filterFieldSplit[0];
|
|
66
|
-
const operator = filterFieldSplit.length > 1 ? filterFieldSplit[1] : 'eq';
|
|
67
|
-
// prepare value
|
|
68
|
-
let value = filterFieldSplit.length > 2 ? filterFieldSplit.slice(2).join(':') : '';
|
|
69
|
-
let valueTo = undefined;
|
|
70
|
-
const valueTransformer = (v) => {
|
|
71
|
-
const vLower = v.toLowerCase();
|
|
72
|
-
if (v.startsWith("'")) {
|
|
73
|
-
// string
|
|
74
|
-
return v.substring(1, v.length - 1);
|
|
75
|
-
}
|
|
76
|
-
else if (vLower === 'true' || vLower === 'false') {
|
|
77
|
-
// boolean
|
|
78
|
-
return vLower === 'true';
|
|
79
|
-
}
|
|
80
|
-
else if (vLower === 'null') {
|
|
81
|
-
// null
|
|
82
|
-
return null;
|
|
83
|
-
}
|
|
84
|
-
else if (/\d{4}-\d{1,2}-\d{1,2}/.test(v) || /\d{4}-\d{1,2}-\d{1,2}T\d{1,2}:*/.test(v)) {
|
|
85
|
-
return new Date(v);
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
// number
|
|
89
|
-
return parseFloat(v);
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
if (value.startsWith('[') && value.endsWith(']')) {
|
|
93
|
-
// array
|
|
94
|
-
value = value
|
|
95
|
-
.substring(1, value.length - 1)
|
|
96
|
-
.split(',')
|
|
97
|
-
.map((v) => valueTransformer(v));
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
value = valueTransformer(value);
|
|
101
|
-
}
|
|
102
|
-
if (operator === 'ft') {
|
|
103
|
-
valueTo = value[1];
|
|
104
|
-
value = value[0];
|
|
105
|
-
}
|
|
106
|
-
else if (operator === 'ex' || operator === 'dne') {
|
|
107
|
-
value = null;
|
|
108
|
-
}
|
|
109
|
-
const filterDescriptor = filterDescriptors.find(f => f.property === field);
|
|
110
|
-
const matchMode = this.getMapping(operator, filterDescriptor?.filterType, 1);
|
|
111
|
-
if (matchMode && filterDescriptor) {
|
|
112
|
-
mediusParamsBuilder.withFilter(filterDescriptor.property, value, valueTo, this.getMediusFilterMatchTypeFromPrimeMatchMode(matchMode[0]));
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
return mediusParamsBuilder.build();
|
|
117
|
-
}
|
|
118
|
-
fromPrimeLazyLoadEventToAngularQueryParams(event) {
|
|
119
|
-
const params = {
|
|
120
|
-
first: null,
|
|
121
|
-
rows: null,
|
|
122
|
-
sort: null,
|
|
123
|
-
filter: null
|
|
124
|
-
};
|
|
125
|
-
if (event.first && event.first > 0) {
|
|
126
|
-
params['first'] = event.first;
|
|
127
|
-
}
|
|
128
|
-
if (event.rows && event.rows > 0) {
|
|
129
|
-
params['rows'] = event.rows;
|
|
130
|
-
}
|
|
131
|
-
if (event.multiSortMeta?.length) {
|
|
132
|
-
params['sort'] = event.multiSortMeta?.map(s => `${s.field}${s.order === 1 ? '' : ':desc'}`).join(',');
|
|
133
|
-
}
|
|
134
|
-
if (event.filters) {
|
|
135
|
-
const filters = [];
|
|
136
|
-
for (const field in event.filters) {
|
|
137
|
-
let fieldFilters = event.filters[field];
|
|
138
|
-
if (typeof fieldFilters === 'undefined') {
|
|
139
|
-
continue;
|
|
140
|
-
}
|
|
141
|
-
if (!Array.isArray(fieldFilters)) {
|
|
142
|
-
fieldFilters = [fieldFilters];
|
|
143
|
-
}
|
|
144
|
-
for (const fieldFilter of fieldFilters) {
|
|
145
|
-
const primeOperator = fieldFilter.matchMode;
|
|
146
|
-
let value = fieldFilter.value;
|
|
147
|
-
const operatorMapping = primeOperator ? this.getMapping(primeOperator, undefined, 0) : undefined;
|
|
148
|
-
if (operatorMapping) {
|
|
149
|
-
if (typeof value !== 'undefined' && value !== null) {
|
|
150
|
-
let doAddFilter = false;
|
|
151
|
-
const transformValue = (v) => {
|
|
152
|
-
if (typeof v === 'string' && v.length > 0) {
|
|
153
|
-
return [`'${v}'`, true];
|
|
154
|
-
}
|
|
155
|
-
else if (typeof v === 'number' || typeof v === 'boolean') {
|
|
156
|
-
return [v, true];
|
|
157
|
-
}
|
|
158
|
-
else if (v instanceof Date) {
|
|
159
|
-
return [v.toISOString(), true];
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
return [null, false];
|
|
163
|
-
}
|
|
164
|
-
};
|
|
165
|
-
if (Array.isArray(value)) {
|
|
166
|
-
value = `[${value
|
|
167
|
-
.map(v => transformValue(v))
|
|
168
|
-
.filter(v => v[1])
|
|
169
|
-
.map(v => v[0])
|
|
170
|
-
.join(',')}]`;
|
|
171
|
-
doAddFilter = true;
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
[value, doAddFilter] = transformValue(value);
|
|
175
|
-
}
|
|
176
|
-
if (doAddFilter) {
|
|
177
|
-
filters.push(`${field}:${operatorMapping[1]}:${value}`);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
else if (operatorMapping[2] === MediusFilterMatchType.Exists || operatorMapping[2] === MediusFilterMatchType.DoesNotExist) {
|
|
181
|
-
filters.push(`${field}:${operatorMapping[1]}`);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
if (filters.length > 0) {
|
|
187
|
-
params['filter'] = filters.join(';');
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
return params;
|
|
191
|
-
}
|
|
192
|
-
modifySortProperties(mediusQueryParams, columnDescriptors) {
|
|
193
|
-
if (mediusQueryParams.sortProperty && columnDescriptors) {
|
|
194
|
-
for (const [i, sortProperty] of mediusQueryParams.sortProperty.entries()) {
|
|
195
|
-
mediusQueryParams.sortProperty[i] = columnDescriptors.find(el => el.property === sortProperty)?.sortProperty ?? sortProperty;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
modifyFilterProperties(mediusQueryParams, filterDescriptors) {
|
|
200
|
-
for (const filterParam of mediusQueryParams.filterParams ?? []) {
|
|
201
|
-
const filterDescriptor = filterDescriptors.find(f => f.property === filterParam.property);
|
|
202
|
-
filterParam.property = filterDescriptor?.filterProperty ?? filterParam.property;
|
|
203
|
-
if (filterDescriptor?.filterType === FilterTypeEnum.Date) {
|
|
204
|
-
const convertDateType = filterDescriptor.datePickerValueNoTime || (!this.dateOnlyDisabled && !filterDescriptor.datePickerShowTime) ? 'date' : 'date-time';
|
|
205
|
-
const convertDateTimeOpts = {
|
|
206
|
-
utc: filterDescriptor.datePickerValueUtc ?? this.dateTimeInUtc,
|
|
207
|
-
noMillis: !this.dateTimeWithMillis,
|
|
208
|
-
noTimezone: filterDescriptor.datePickerValueNoTimezone ?? !this.dateTimeWithTimezone
|
|
209
|
-
};
|
|
210
|
-
if (filterParam.filterMatchType === MediusFilterMatchType.Equals) {
|
|
211
|
-
// convert date equals filter to date range
|
|
212
|
-
const filterDate = filterParam.filterValue;
|
|
213
|
-
const startDate = new Date(filterDate);
|
|
214
|
-
const endDate = new Date(startDate);
|
|
215
|
-
if (filterDescriptor.datePickerShowTime) {
|
|
216
|
-
startDate.setHours(startDate.getHours(), startDate.getMinutes(), 0, 0);
|
|
217
|
-
endDate.setHours(endDate.getHours(), endDate.getMinutes() + 1, 0, 0);
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
220
|
-
startDate.setHours(0, 0, 0, 0);
|
|
221
|
-
endDate.setHours(0, 0, 0, 0);
|
|
222
|
-
endDate.setDate(endDate.getDate() + 1);
|
|
223
|
-
}
|
|
224
|
-
filterParam.filterMatchType = MediusFilterMatchType.FromTo;
|
|
225
|
-
filterParam.filterValue = startDate;
|
|
226
|
-
filterParam.filterValueTo = endDate;
|
|
227
|
-
}
|
|
228
|
-
// transform dates to correct iso string
|
|
229
|
-
if (typeof filterParam.filterValue !== 'undefined') {
|
|
230
|
-
if (Array.isArray(filterParam.filterValue)) {
|
|
231
|
-
filterParam.filterValue = filterParam.filterValue.map(v => DateUtil.toIsoString(v, convertDateType, convertDateTimeOpts));
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
filterParam.filterValue = DateUtil.toIsoString(filterParam.filterValue, convertDateType, convertDateTimeOpts);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
if (typeof filterParam.filterValueTo !== 'undefined') {
|
|
238
|
-
if (Array.isArray(filterParam.filterValueTo)) {
|
|
239
|
-
filterParam.filterValueTo = filterParam.filterValueTo.map(v => DateUtil.toIsoString(v, convertDateType, convertDateTimeOpts));
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
filterParam.filterValueTo = DateUtil.toIsoString(filterParam.filterValueTo, convertDateType, convertDateTimeOpts);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
fromPrimeLazyLoadEventToMediusQueryParams(event) {
|
|
249
|
-
const queryParamBuilder = MediusQueryParamBuilder.create(event.rows ?? undefined, event.first);
|
|
250
|
-
// apply sorting
|
|
251
|
-
if (event.multiSortMeta) {
|
|
252
|
-
event.multiSortMeta.forEach(msm => queryParamBuilder.withSort(msm.field, msm.order === 1));
|
|
253
|
-
}
|
|
254
|
-
// apply filtering
|
|
255
|
-
if (event.filters) {
|
|
256
|
-
for (const key of Object.keys(event.filters)) {
|
|
257
|
-
const filterEvent = event.filters[key];
|
|
258
|
-
if (Array.isArray(filterEvent)) {
|
|
259
|
-
filterEvent.forEach(e => this.addMediusFilterFromPrimeFilterMetadata(queryParamBuilder, key, e));
|
|
260
|
-
}
|
|
261
|
-
else if (typeof filterEvent === 'object') {
|
|
262
|
-
this.addMediusFilterFromPrimeFilterMetadata(queryParamBuilder, key, filterEvent);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
return queryParamBuilder.build();
|
|
267
|
-
}
|
|
268
|
-
addMediusFilterFromPrimeFilterMetadata(queryParamBuilder, property, filterMetadata) {
|
|
269
|
-
const matchType = this.getMediusFilterMatchTypeFromPrimeMatchMode(filterMetadata.matchMode ?? 'equals');
|
|
270
|
-
if (matchType[2] !== MediusFilterMatchType.Exists &&
|
|
271
|
-
matchType[2] !== MediusFilterMatchType.DoesNotExist &&
|
|
272
|
-
(filterMetadata.value === null || typeof filterMetadata.value === 'undefined')) {
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
275
|
-
queryParamBuilder.withFilter(property, filterMetadata.value, undefined, matchType);
|
|
276
|
-
}
|
|
277
|
-
getMediusFilterMatchTypeFromPrimeMatchMode(matchMode, dataType) {
|
|
278
|
-
return this.getMapping(matchMode, dataType)?.[2] ?? MediusFilterMatchType.Equals;
|
|
279
|
-
}
|
|
280
|
-
getMapping(matchMode, dataType, idx = 0) {
|
|
281
|
-
const mappings = this.matchModeMapping.filter(m => m[idx] === matchMode && (!dataType || !m[3] || dataType === m[3]));
|
|
282
|
-
if (mappings.length === 0) {
|
|
283
|
-
return null;
|
|
284
|
-
}
|
|
285
|
-
else if (mappings.length === 1) {
|
|
286
|
-
return mappings[0];
|
|
287
|
-
}
|
|
288
|
-
else {
|
|
289
|
-
return mappings.sort((m1, m2) => (m2[3] ?? -1) - (m1[3] ?? -1))[0];
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVkaXVzLXJlc3QudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYXBpL3V0aWxzL21lZGl1cy1yZXN0LnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGVBQWUsRUFBaUIsTUFBTSxhQUFhLENBQUM7QUFLNUQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFDLHFCQUFxQixFQUFvQix1QkFBdUIsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUUzRixNQUFNLE9BQU8sY0FBYzthQUNSLGNBQVMsR0FBbUIsSUFBSSxjQUFjLEVBQUUsQUFBdkMsQ0FBd0M7SUF5QmhFO1FBeEJBLGlFQUFpRTtRQUNoRCxxQkFBZ0IsR0FBNEI7WUFDekQsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDO1lBQ3JFLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUscUJBQXFCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQztZQUN2RSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7WUFDbEUsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDO1lBQzdFLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUscUJBQXFCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQztZQUMxRSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUM7WUFDM0UsQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFF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LEdBQUcsQ0FBQztRQUNuRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RILElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdkIsT0FBTyxJQUFJLENBQUM7U0FDZjthQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDOUIsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEI7YUFBTTtZQUNILE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3RFO0lBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UGFyYW1zfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge0ZpbHRlck1hdGNoTW9kZSwgRmlsdGVyTWV0YWRhdGF9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7VGFibGVMYXp5TG9hZEV2ZW50fSBmcm9tICdwcmltZW5nL3RhYmxlJztcblxuaW1wb3J0IHtGaWx0ZXJEZXNjcmlwdG9yfSBmcm9tICcuLi8uLi9kZXNjcmlwdG9ycy9maWx0ZXInO1xuaW1wb3J0IHtDb2x1bW5EZXNjcmlwdG9yfSBmcm9tICcuLi8uLi9kZXNjcmlwdG9ycy90YWJsZSc7XG5pbXBvcnQge0ZpbHRlclR5cGVFbnVtfSBmcm9tICcuLi8uLi9kZXNjcmlwdG9ycy90eXBlcyc7XG5pbXBvcnQge01hdGNoTW9kZU1hcFR5cGV9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7RGF0ZVV0aWx9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLCBNZWRpdXNRdWVyeVBhcmFtLCBNZWRpdXNRdWVyeVBhcmFtQnVpbGRlcn0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IGNsYXNzIE1lZGl1c1Jlc3RVdGlsIHtcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IE1lZGl1c1Jlc3RVdGlsID0gbmV3IE1lZGl1c1Jlc3RVdGlsKCk7XG4gICAgLy8gZmlyc3QgdmFsdWUgaXMgZnJvbSBwcmltZU5HLCBzZWNvbmQgaXMgZm9yIHVzZSBpbiBxdWVyeSBwYXJhbXNcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1hdGNoTW9kZU1hcHBpbmc6IEFycmF5PE1hdGNoTW9kZU1hcFR5cGU+ID0gW1xuICAgICAgICBbRmlsdGVyTWF0Y2hNb2RlLkNPTlRBSU5TLCAnYycsIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5Db250YWlucywgbnVsbF0sXG4gICAgICAgIFtGaWx0ZXJNYXRjaE1vZGUuRU5EU19XSVRILCAnZXcnLCBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRW5kc1dpdGgsIG51bGxdLFxuICAgICAgICBbRmlsdGVyTWF0Y2hNb2RlLkVRVUFMUywgJ2VxJywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkVxdWFscywgbnVsbF0sXG4gICAgICAgIFtGaWx0ZXJNYXRjaE1vZGUuR1JFQVRFUl9USEFOLCAnZ3QnLCBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuR3JlYXRlclRoYW4sIG51bGxdLFxuICAgICAgICBbRmlsdGVyTWF0Y2hNb2RlLkxFU1NfVEhBTiwgJ2x0JywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLlNtYWxsZXJUaGFuLCBudWxsXSxcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5TVEFSVFNfV0lUSCwgJ3N3JywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLlN0YXJ0c1dpdGgsIG51bGxdLFxuICAgICAgICBbRmlsdGVyTWF0Y2hNb2RlLklOLCAnaW4nLCBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuSW4sIG51bGxdLFxuICAgICAgICBbRmlsdGVyTWF0Y2hNb2RlLk5PVF9FUVVBTFMsICduZXEnLCBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuTm90RXF1YWxzLCBudWxsXSxcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5CRVRXRUVOLCAnZnQnLCBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRnJvbVRvLCBGaWx0ZXJUeXBlRW51bS5EYXRlXSxcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5EQVRFX0lTLCAnZHRlcScsIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5FcXVhbHMsIEZpbHRlclR5cGVFbnVtLkRhdGVdLFxuICAgICAgICBbRmlsdGVyTWF0Y2hNb2RlLkRBVEVfQkVGT1JFLCAnbHQnLCBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuU21hbGxlclRoYW4sIEZpbHRlclR5cGVFbnVtLkRhdGVdLFxuICAgICAgICBbRmlsdGVyTWF0Y2hNb2RlLkRBVEVfQUZURVIsICdndCcsIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5HcmVhdGVyVGhhbiwgRmlsdGVyVHlwZUVudW0uRGF0ZV0sXG4gICAgICAgIFtGaWx0ZXJNYXRjaE1vZGUuREFURV9JU19OT1QsICduZXEnLCBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuTm90RXF1YWxzLCBGaWx0ZXJUeXBlRW51bS5EYXRlXSxcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5JUywgJ2V4JywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkV4aXN0cywgbnVsbF0sXG4gICAgICAgIFtGaWx0ZXJNYXRjaE1vZGUuSVNfTk9ULCAnZG5lJywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkRvZXNOb3RFeGlzdCwgbnVsbF1cbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBkYXRlVGltZUluVXRjID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBkYXRlVGltZVdpdGhUaW1lem9uZSA9IHRydWU7XG4gICAgcHJpdmF0ZSBkYXRlVGltZVdpdGhNaWxsaXMgPSB0cnVlO1xuICAgIHByaXZhdGUgZGF0ZU9ubHlEaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gZW1wdHlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCgpOiBNZWRpdXNSZXN0VXRpbCB7XG4gICAgICAgIHJldHVybiBNZWRpdXNSZXN0VXRpbC5faW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbmZpZ3VyZShjb25maWc6IHtkYXRlVGltZUluVXRjPzogYm9vbGVhbjsgZGF0ZVRpbWVXaXRoVGltZXpvbmU/OiBib29sZWFuOyBkYXRlVGltZVdpdGhNaWxsaXM/OiBib29sZWFuOyBkYXRlT25seURpc2FibGVkPzogYm9vbGVhbn0pOiB2b2lkIHtcbiAgICAgICAgaWYgKGNvbmZpZy5kYXRlVGltZUluVXRjICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVJblV0YyA9IGNvbmZpZy5kYXRlVGltZUluVXRjO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuZGF0ZVRpbWVXaXRoVGltZXpvbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5kYXRlVGltZVdpdGhUaW1lem9uZSA9IGNvbmZpZy5kYXRlVGltZVdpdGhUaW1lem9uZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmRhdGVUaW1lV2l0aE1pbGxpcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lV2l0aE1pbGxpcyA9IGNvbmZpZy5kYXRlVGltZVdpdGhNaWxsaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5kYXRlT25seURpc2FibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0ZU9ubHlEaXNhYmxlZCA9IGNvbmZpZy5kYXRlT25seURpc2FibGVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGZyb21Bbmd1bGFyUXVlcnlQYXJhbXNUb01lZGl1c1F1ZXJ5UGFyYW1zKFxuICAgICAgICBwYXJhbXM6IFBhcmFtcyxcbiAgICAgICAgZmlsdGVyRGVzY3JpcHRvcnM6IEFycmF5PEZpbHRlckRlc2NyaXB0b3I8YW55Pj4sXG4gICAgICAgIGRlZmF1bHRJdGVtc1BlclBhZ2UgPSAxMCxcbiAgICAgICAgZGVmYXVsdE9mZnNldCA9IDBcbiAgICApOiBNZWRpdXNRdWVyeVBhcmFtIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcGFyYW1zWydmaXJzdCddID8gcGFyc2VJbnQocGFyYW1zWydmaXJzdCddKSA6IGRlZmF1bHRPZmZzZXQ7XG4gICAgICAgIGNvbnN0IGl0ZW1zUGVyUGFnZSA9IHBhcmFtc1sncm93cyddID8gcGFyc2VJbnQocGFyYW1zWydyb3dzJ10pIDogZGVmYXVsdEl0ZW1zUGVyUGFnZTtcblxuICAgICAgICBjb25zdCBtZWRpdXNQYXJhbXNCdWlsZGVyID0gTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIuY3JlYXRlKGl0ZW1zUGVyUGFnZSwgb2Zmc2V0KTtcblxuICAgICAgICBpZiAocGFyYW1zWydzb3J0J10pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc29ydCBvZiBwYXJhbXNbJ3NvcnQnXS5zcGxpdCgnLCcpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcXBTb3J0U3BsaXQgPSBzb3J0LnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBxcFNvcnRTcGxpdFswXTtcbiAgICAgICAgICAgICAgICBjb25zdCBhc2MgPSBxcFNvcnRTcGxpdC5sZW5ndGggPiAxID8gcXBTb3J0U3BsaXRbMV0gPT09ICdhc2MnIDogdHJ1ZTtcbiAgICAgICAgICAgICAgICBtZWRpdXNQYXJhbXNCdWlsZGVyLndpdGhTb3J0KGZpZWxkLCBhc2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXNbJ2ZpbHRlciddKSB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJTcGxpdCA9IHBhcmFtc1snZmlsdGVyJ10uc3BsaXQoJzsnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmlsdGVyRmllbGQgb2YgZmlsdGVyU3BsaXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJGaWVsZFNwbGl0ID0gZmlsdGVyRmllbGQuc3BsaXQoJzonKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IGZpbHRlckZpZWxkU3BsaXRbMF07XG4gICAgICAgICAgICAgICAgY29uc3Qgb3BlcmF0b3IgPSBmaWx0ZXJGaWVsZFNwbGl0Lmxlbmd0aCA+IDEgPyBmaWx0ZXJGaWVsZFNwbGl0WzFdIDogJ2VxJztcblxuICAgICAgICAgICAgICAgIC8vIHByZXBhcmUgdmFsdWVcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWU6IGFueSA9IGZpbHRlckZpZWxkU3BsaXQubGVuZ3RoID4gMiA/IGZpbHRlckZpZWxkU3BsaXQuc2xpY2UoMikuam9pbignOicpIDogJyc7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlVG86IGFueSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlVHJhbnNmb3JtZXIgPSAodjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZMb3dlciA9IHYudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYuc3RhcnRzV2l0aChcIidcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYuc3Vic3RyaW5nKDEsIHYubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodkxvd2VyID09PSAndHJ1ZScgfHwgdkxvd2VyID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBib29sZWFuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdkxvd2VyID09PSAndHJ1ZSc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodkxvd2VyID09PSAnbnVsbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKC9cXGR7NH0tXFxkezEsMn0tXFxkezEsMn0vLnRlc3QodikgfHwgL1xcZHs0fS1cXGR7MSwyfS1cXGR7MSwyfVRcXGR7MSwyfToqLy50ZXN0KHYpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUodik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHYpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdbJykgJiYgdmFsdWUuZW5kc1dpdGgoJ10nKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBhcnJheVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgodjogc3RyaW5nKSA9PiB2YWx1ZVRyYW5zZm9ybWVyKHYpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlVHJhbnNmb3JtZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvcGVyYXRvciA9PT0gJ2Z0Jykge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZVRvID0gdmFsdWVbMV07XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbMF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gJ2V4JyB8fCBvcGVyYXRvciA9PT0gJ2RuZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlckRlc2NyaXB0b3IgPSBmaWx0ZXJEZXNjcmlwdG9ycy5maW5kKGYgPT4gZi5wcm9wZXJ0eSA9PT0gZmllbGQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoTW9kZSA9IHRoaXMuZ2V0TWFwcGluZyhvcGVyYXRvciwgZmlsdGVyRGVzY3JpcHRvcj8uZmlsdGVyVHlwZSwgMSk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoTW9kZSAmJiBmaWx0ZXJEZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lZGl1c1BhcmFtc0J1aWxkZXIud2l0aEZpbHRlcihmaWx0ZXJEZXNjcmlwdG9yLnByb3BlcnR5LCB2YWx1ZSwgdmFsdWVUbywgdGhpcy5nZXRNZWRpdXNGaWx0ZXJNYXRjaFR5cGVGcm9tUHJpbWVNYXRjaE1vZGUobWF0Y2hNb2RlWzBdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lZGl1c1BhcmFtc0J1aWxkZXIuYnVpbGQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZnJvbVByaW1lTGF6eUxvYWRFdmVudFRvQW5ndWxhclF1ZXJ5UGFyYW1zKGV2ZW50OiBUYWJsZUxhenlMb2FkRXZlbnQpOiBQYXJhbXMge1xuICAgICAgICBjb25zdCBwYXJhbXM6IFBhcmFtcyA9IHtcbiAgICAgICAgICAgIGZpcnN0OiBudWxsLFxuICAgICAgICAgICAgcm93czogbnVsbCxcbiAgICAgICAgICAgIHNvcnQ6IG51bGwsXG4gICAgICAgICAgICBmaWx0ZXI6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZXZlbnQuZmlyc3QgJiYgZXZlbnQuZmlyc3QgPiAwKSB7XG4gICAgICAgICAgICBwYXJhbXNbJ2ZpcnN0J10gPSBldmVudC5maXJzdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQucm93cyAmJiBldmVudC5yb3dzID4gMCkge1xuICAgICAgICAgICAgcGFyYW1zWydyb3dzJ10gPSBldmVudC5yb3dzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50Lm11bHRpU29ydE1ldGE/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcGFyYW1zWydzb3J0J10gPSBldmVudC5tdWx0aVNvcnRNZXRhPy5tYXAocyA9PiBgJHtzLmZpZWxkfSR7cy5vcmRlciA9PT0gMSA/ICcnIDogJzpkZXNjJ31gKS5qb2luKCcsJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZmlsdGVycykge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBldmVudC5maWx0ZXJzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpZWxkRmlsdGVycyA9IGV2ZW50LmZpbHRlcnNbZmllbGRdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmllbGRGaWx0ZXJzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpZWxkRmlsdGVycykpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRGaWx0ZXJzID0gW2ZpZWxkRmlsdGVyc107XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZEZpbHRlciBvZiBmaWVsZEZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJpbWVPcGVyYXRvciA9IGZpZWxkRmlsdGVyLm1hdGNoTW9kZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZmllbGRGaWx0ZXIudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZXJhdG9yTWFwcGluZyA9IHByaW1lT3BlcmF0b3IgPyB0aGlzLmdldE1hcHBpbmcocHJpbWVPcGVyYXRvciwgdW5kZWZpbmVkLCAwKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wZXJhdG9yTWFwcGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9BZGRGaWx0ZXIgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybVZhbHVlID0gKHY6IHVua25vd24pOiBbYW55LCBib29sZWFuXSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2AnJHt2fSdgLCB0cnVlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHYgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt2LCB0cnVlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt2LnRvSVNPU3RyaW5nKCksIHRydWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBmYWxzZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYFske3ZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKHYgPT4gdHJhbnNmb3JtVmFsdWUodikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHYgPT4gdlsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAodiA9PiB2WzBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywnKX1dYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9BZGRGaWx0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZSwgZG9BZGRGaWx0ZXJdID0gdHJhbnNmb3JtVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb0FkZEZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzLnB1c2goYCR7ZmllbGR9OiR7b3BlcmF0b3JNYXBwaW5nWzFdfToke3ZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3JNYXBwaW5nWzJdID09PSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRXhpc3RzIHx8IG9wZXJhdG9yTWFwcGluZ1syXSA9PT0gTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkRvZXNOb3RFeGlzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaChgJHtmaWVsZH06JHtvcGVyYXRvck1hcHBpbmdbMV19YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsdGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zWydmaWx0ZXInXSA9IGZpbHRlcnMuam9pbignOycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG5cbiAgICBwdWJsaWMgbW9kaWZ5U29ydFByb3BlcnRpZXMobWVkaXVzUXVlcnlQYXJhbXM6IE1lZGl1c1F1ZXJ5UGFyYW0sIGNvbHVtbkRlc2NyaXB0b3JzOiBBcnJheTxDb2x1bW5EZXNjcmlwdG9yPGFueSwgYW55Pj4gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG1lZGl1c1F1ZXJ5UGFyYW1zLnNvcnRQcm9wZXJ0eSAmJiBjb2x1bW5EZXNjcmlwdG9ycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaSwgc29ydFByb3BlcnR5XSBvZiBtZWRpdXNRdWVyeVBhcmFtcy5zb3J0UHJvcGVydHkuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgbWVkaXVzUXVlcnlQYXJhbXMuc29ydFByb3BlcnR5W2ldID0gY29sdW1uRGVzY3JpcHRvcnMuZmluZChlbCA9PiBlbC5wcm9wZXJ0eSA9PT0gc29ydFByb3BlcnR5KT8uc29ydFByb3BlcnR5ID8/IHNvcnRQcm9wZXJ0eTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBtb2RpZnlGaWx0ZXJQcm9wZXJ0aWVzKG1lZGl1c1F1ZXJ5UGFyYW1zOiBNZWRpdXNRdWVyeVBhcmFtLCBmaWx0ZXJEZXNjcmlwdG9yczogQXJyYXk8RmlsdGVyRGVzY3JpcHRvcjxhbnk+Pikge1xuICAgICAgICBmb3IgKGNvbnN0IGZpbHRlclBhcmFtIG9mIG1lZGl1c1F1ZXJ5UGFyYW1zLmZpbHRlclBhcmFtcyA/PyBbXSkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyRGVzY3JpcHRvciA9IGZpbHRlckRlc2NyaXB0b3JzLmZpbmQoZiA9PiBmLnByb3BlcnR5ID09PSBmaWx0ZXJQYXJhbS5wcm9wZXJ0eSk7XG4gICAgICAgICAgICBmaWx0ZXJQYXJhbS5wcm9wZXJ0eSA9IGZpbHRlckRlc2NyaXB0b3I/LmZpbHRlclByb3BlcnR5ID8/IGZpbHRlclBhcmFtLnByb3BlcnR5O1xuICAgICAgICAgICAgaWYgKGZpbHRlckRlc2NyaXB0b3I/LmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLkRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb252ZXJ0RGF0ZVR5cGUgPSBmaWx0ZXJEZXNjcmlwdG9yLmRhdGVQaWNrZXJWYWx1ZU5vVGltZSB8fCAoIXRoaXMuZGF0ZU9ubHlEaXNhYmxlZCAmJiAhZmlsdGVyRGVzY3JpcHRvci5kYXRlUGlja2VyU2hvd1RpbWUpID8gJ2RhdGUnIDogJ2RhdGUtdGltZSc7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udmVydERhdGVUaW1lT3B0cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdXRjOiBmaWx0ZXJEZXNjcmlwdG9yLmRhdGVQaWNrZXJWYWx1ZVV0YyA/PyB0aGlzLmRhdGVUaW1lSW5VdGMsXG4gICAgICAgICAgICAgICAgICAgIG5vTWlsbGlzOiAhdGhpcy5kYXRlVGltZVdpdGhNaWxsaXMsXG4gICAgICAgICAgICAgICAgICAgIG5vVGltZXpvbmU6IGZpbHRlckRlc2NyaXB0b3IuZGF0ZVBpY2tlclZhbHVlTm9UaW1lem9uZSA/PyAhdGhpcy5kYXRlVGltZVdpdGhUaW1lem9uZVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyUGFyYW0uZmlsdGVyTWF0Y2hUeXBlID09PSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRXF1YWxzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgZGF0ZSBlcXVhbHMgZmlsdGVyIHRvIGRhdGUgcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyRGF0ZSA9IGZpbHRlclBhcmFtLmZpbHRlclZhbHVlIGFzIERhdGU7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoZmlsdGVyRGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZERhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJEZXNjcmlwdG9yLmRhdGVQaWNrZXJTaG93VGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlLnNldEhvdXJzKHN0YXJ0RGF0ZS5nZXRIb3VycygpLCBzdGFydERhdGUuZ2V0TWludXRlcygpLCAwLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZERhdGUuc2V0SG91cnMoZW5kRGF0ZS5nZXRIb3VycygpLCBlbmREYXRlLmdldE1pbnV0ZXMoKSArIDEsIDAsIDApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZERhdGUuc2V0RGF0ZShlbmREYXRlLmdldERhdGUoKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFyYW0uZmlsdGVyTWF0Y2hUeXBlID0gTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkZyb21UbztcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFyYW0uZmlsdGVyVmFsdWUgPSBzdGFydERhdGU7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtLmZpbHRlclZhbHVlVG8gPSBlbmREYXRlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHRyYW5zZm9ybSBkYXRlcyB0byBjb3JyZWN0IGlzbyBzdHJpbmdcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpbHRlclBhcmFtLmZpbHRlclZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJQYXJhbS5maWx0ZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtLmZpbHRlclZhbHVlID0gZmlsdGVyUGFyYW0uZmlsdGVyVmFsdWUubWFwKHYgPT4gRGF0ZVV0aWwudG9Jc29TdHJpbmcodiwgY29udmVydERhdGVUeXBlLCBjb252ZXJ0RGF0ZVRpbWVPcHRzKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJQYXJhbS5maWx0ZXJWYWx1ZSA9IERhdGVVdGlsLnRvSXNvU3RyaW5nKGZpbHRlclBhcmFtLmZpbHRlclZhbHVlLCBjb252ZXJ0RGF0ZVR5cGUsIGNvbnZlcnREYXRlVGltZU9wdHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsdGVyUGFyYW0uZmlsdGVyVmFsdWVUbyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyUGFyYW0uZmlsdGVyVmFsdWVUbykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtLmZpbHRlclZhbHVlVG8gPSBmaWx0ZXJQYXJhbS5maWx0ZXJWYWx1ZVRvLm1hcCh2ID0+IERhdGVVdGlsLnRvSXNvU3RyaW5nKHYsIGNvbnZlcnREYXRlVHlwZSwgY29udmVydERhdGVUaW1lT3B0cykpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFyYW0uZmlsdGVyVmFsdWVUbyA9IERhdGVVdGlsLnRvSXNvU3RyaW5nKGZpbHRlclBhcmFtLmZpbHRlclZhbHVlVG8sIGNvbnZlcnREYXRlVHlwZSwgY29udmVydERhdGVUaW1lT3B0cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZnJvbVByaW1lTGF6eUxvYWRFdmVudFRvTWVkaXVzUXVlcnlQYXJhbXMoZXZlbnQ6IFRhYmxlTGF6eUxvYWRFdmVudCk6IE1lZGl1c1F1ZXJ5UGFyYW0ge1xuICAgICAgICBjb25zdCBxdWVyeVBhcmFtQnVpbGRlciA9IE1lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyLmNyZWF0ZShldmVudC5yb3dzID8/IHVuZGVmaW5lZCwgZXZlbnQuZmlyc3QpO1xuXG4gICAgICAgIC8vIGFwcGx5IHNvcnRpbmdcbiAgICAgICAgaWYgKGV2ZW50Lm11bHRpU29ydE1ldGEpIHtcbiAgICAgICAgICAgIGV2ZW50Lm11bHRpU29ydE1ldGEuZm9yRWFjaChtc20gPT4gcXVlcnlQYXJhbUJ1aWxkZXIud2l0aFNvcnQobXNtLmZpZWxkLCBtc20ub3JkZXIgPT09IDEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFwcGx5IGZpbHRlcmluZ1xuICAgICAgICBpZiAoZXZlbnQuZmlsdGVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZXZlbnQuZmlsdGVycykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJFdmVudCA9IGV2ZW50LmZpbHRlcnNba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJFdmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgKGZpbHRlckV2ZW50IGFzIEZpbHRlck1ldGFkYXRhW10pLmZvckVhY2goZSA9PiB0aGlzLmFkZE1lZGl1c0ZpbHRlckZyb21QcmltZUZpbHRlck1ldGFkYXRhKHF1ZXJ5UGFyYW1CdWlsZGVyLCBrZXksIGUpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWx0ZXJFdmVudCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRNZWRpdXNGaWx0ZXJGcm9tUHJpbWVGaWx0ZXJNZXRhZGF0YShxdWVyeVBhcmFtQnVpbGRlciwga2V5LCBmaWx0ZXJFdmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW1CdWlsZGVyLmJ1aWxkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZE1lZGl1c0ZpbHRlckZyb21QcmltZUZpbHRlck1ldGFkYXRhKHF1ZXJ5UGFyYW1CdWlsZGVyOiBNZWRpdXNRdWVyeVBhcmFtQnVpbGRlciwgcHJvcGVydHk6IHN0cmluZywgZmlsdGVyTWV0YWRhdGE6IEZpbHRlck1ldGFkYXRhKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoVHlwZTogTWVkaXVzRmlsdGVyTWF0Y2hUeXBlID0gdGhpcy5nZXRNZWRpdXNGaWx0ZXJNYXRjaFR5cGVGcm9tUHJpbWVNYXRjaE1vZGUoZmlsdGVyTWV0YWRhdGEubWF0Y2hNb2RlID8/ICdlcXVhbHMnKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgbWF0Y2hUeXBlWzJdICE9PSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRXhpc3RzICYmXG4gICAgICAgICAgICBtYXRjaFR5cGVbMl0gIT09IE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5Eb2VzTm90RXhpc3QgJiZcbiAgICAgICAgICAgIChmaWx0ZXJNZXRhZGF0YS52YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgZmlsdGVyTWV0YWRhdGEudmFsdWUgPT09ICd1bmRlZmluZWQnKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBxdWVyeVBhcmFtQnVpbGRlci53aXRoRmlsdGVyKHByb3BlcnR5LCBmaWx0ZXJNZXRhZGF0YS52YWx1ZSwgdW5kZWZpbmVkLCBtYXRjaFR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNZWRpdXNGaWx0ZXJNYXRjaFR5cGVGcm9tUHJpbWVNYXRjaE1vZGUobWF0Y2hNb2RlOiBzdHJpbmcsIGRhdGFUeXBlPzogRmlsdGVyVHlwZUVudW0pOiBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRNYXBwaW5nKG1hdGNoTW9kZSwgZGF0YVR5cGUpPy5bMl0gPz8gTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkVxdWFscztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TWFwcGluZyhtYXRjaE1vZGU6IHN0cmluZywgZGF0YVR5cGU/OiBGaWx0ZXJUeXBlRW51bSwgaWR4ID0gMCk6IE1hdGNoTW9kZU1hcFR5cGUgfCBudWxsIHtcbiAgICAgICAgY29uc3QgbWFwcGluZ3MgPSB0aGlzLm1hdGNoTW9kZU1hcHBpbmcuZmlsdGVyKG0gPT4gbVtpZHhdID09PSBtYXRjaE1vZGUgJiYgKCFkYXRhVHlwZSB8fCAhbVszXSB8fCBkYXRhVHlwZSA9PT0gbVszXSkpO1xuICAgICAgICBpZiAobWFwcGluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChtYXBwaW5ncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBwaW5nc1swXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBwaW5ncy5zb3J0KChtMSwgbTIpID0+IChtMlszXSA/PyAtMSkgLSAobTFbM10gPz8gLTEpKVswXTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
import { TypeRegistry } from '../../registry/type.registry';
|
|
2
|
-
import { DateUtil, DecoratorMetadataUtil } from '../../utils';
|
|
3
|
-
export class ObjectSerializer {
|
|
4
|
-
constructor() {
|
|
5
|
-
this._logCategory = 'ObjectSerializer';
|
|
6
|
-
this._primitives = ['string', 'boolean', 'double', 'integer', 'long', 'float', 'number', 'any'];
|
|
7
|
-
this.dateTimeInUtc = false;
|
|
8
|
-
this.dateTimeWithTimezone = true;
|
|
9
|
-
this.dateTimeWithMillis = true;
|
|
10
|
-
}
|
|
11
|
-
static { this._instance = new ObjectSerializer(); }
|
|
12
|
-
get primitives() {
|
|
13
|
-
return this._primitives;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Only use one instance of object (out of Angular context)
|
|
17
|
-
*/
|
|
18
|
-
static get() {
|
|
19
|
-
return ObjectSerializer._instance;
|
|
20
|
-
}
|
|
21
|
-
configure(config) {
|
|
22
|
-
if (config.dateTimeInUtc !== undefined) {
|
|
23
|
-
this.dateTimeInUtc = config.dateTimeInUtc;
|
|
24
|
-
}
|
|
25
|
-
if (config.dateTimeWithTimezone !== undefined) {
|
|
26
|
-
this.dateTimeWithTimezone = config.dateTimeWithTimezone;
|
|
27
|
-
}
|
|
28
|
-
if (config.dateTimeWithMillis !== undefined) {
|
|
29
|
-
this.dateTimeWithMillis = config.dateTimeWithMillis;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
findCorrectType(data, expectedTypeName) {
|
|
33
|
-
if (data == undefined) {
|
|
34
|
-
return expectedTypeName;
|
|
35
|
-
}
|
|
36
|
-
else if (this._primitives.indexOf(expectedTypeName.toLowerCase()) !== -1) {
|
|
37
|
-
return expectedTypeName;
|
|
38
|
-
}
|
|
39
|
-
else if (expectedTypeName === 'Date') {
|
|
40
|
-
return expectedTypeName;
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
const enumType = TypeRegistry.get().findEnum(expectedTypeName);
|
|
44
|
-
if (enumType) {
|
|
45
|
-
return expectedTypeName;
|
|
46
|
-
}
|
|
47
|
-
const type = TypeRegistry.get().findType(expectedTypeName);
|
|
48
|
-
if (!type) {
|
|
49
|
-
return expectedTypeName; // w/e we don't know the type
|
|
50
|
-
}
|
|
51
|
-
// Check the discriminator
|
|
52
|
-
const discriminatorProperty = type.discriminator;
|
|
53
|
-
if (discriminatorProperty == null) {
|
|
54
|
-
return expectedTypeName; // the type does not have a discriminator. use it.
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
if (data[discriminatorProperty]) {
|
|
58
|
-
const discriminatorType = data[discriminatorProperty];
|
|
59
|
-
const type = TypeRegistry.get().findType(expectedTypeName);
|
|
60
|
-
if (type) {
|
|
61
|
-
return discriminatorType; // use the type given in the discriminator
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
return expectedTypeName; // discriminator did not map to a type
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
return expectedTypeName; // discriminator was not present (or an empty string)
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
serializeClass(data, type) {
|
|
74
|
-
return this.serialize(data, DecoratorMetadataUtil.findTypeName(type) ?? undefined);
|
|
75
|
-
}
|
|
76
|
-
serializeClassArray(data, type) {
|
|
77
|
-
return this.serialize(data, `Array<${DecoratorMetadataUtil.findTypeName(type)}>`);
|
|
78
|
-
}
|
|
79
|
-
serialize(data, typeName, subtype) {
|
|
80
|
-
if (data == undefined) {
|
|
81
|
-
return data;
|
|
82
|
-
}
|
|
83
|
-
else if (typeName && this._primitives.indexOf(typeName.toLowerCase()) !== -1) {
|
|
84
|
-
return data;
|
|
85
|
-
}
|
|
86
|
-
else if (typeName && typeName.lastIndexOf('Array<', 0) === 0) {
|
|
87
|
-
// string.startsWith pre es6
|
|
88
|
-
let subType = typeName.replace('Array<', ''); // Array<Type> => Type>
|
|
89
|
-
subType = subType.substring(0, subType.length - 1); // Type> => Type
|
|
90
|
-
const transformedData = [];
|
|
91
|
-
// tslint:disable-next-line:prefer-for-of
|
|
92
|
-
for (let index = 0; index < data.length; index++) {
|
|
93
|
-
const datum = data[index];
|
|
94
|
-
transformedData.push(this.serialize(datum, subType));
|
|
95
|
-
}
|
|
96
|
-
return transformedData;
|
|
97
|
-
}
|
|
98
|
-
else if (typeName === 'Date') {
|
|
99
|
-
const dateOnly = subtype?.toLowerCase() === 'date';
|
|
100
|
-
return DateUtil.toIsoString(data, dateOnly ? 'date' : 'date-time', {
|
|
101
|
-
utc: this.dateTimeInUtc,
|
|
102
|
-
noTimezone: !this.dateTimeWithTimezone,
|
|
103
|
-
noMillis: !this.dateTimeWithMillis
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
else if (typeName) {
|
|
107
|
-
const enumType = TypeRegistry.get().findEnum(typeName);
|
|
108
|
-
if (enumType) {
|
|
109
|
-
return data;
|
|
110
|
-
}
|
|
111
|
-
const type = TypeRegistry.get().findType(typeName);
|
|
112
|
-
if (!type) {
|
|
113
|
-
// in case we dont know the type
|
|
114
|
-
return data;
|
|
115
|
-
}
|
|
116
|
-
// Get the actual type of this object
|
|
117
|
-
const correctedTypeName = this.findCorrectType(data, typeName);
|
|
118
|
-
const correctedType = TypeRegistry.get().findType(correctedTypeName);
|
|
119
|
-
// get the map for the correct type.
|
|
120
|
-
const attributeTypes = correctedType.getAttributeTypeMap();
|
|
121
|
-
const instance = {};
|
|
122
|
-
// tslint:disable-next-line:prefer-for-of
|
|
123
|
-
for (let index = 0; index < attributeTypes.length; index++) {
|
|
124
|
-
const attributeType = attributeTypes[index];
|
|
125
|
-
instance[attributeType.baseName] = this.serialize(data[attributeType.name], attributeType.type, attributeType.subtype);
|
|
126
|
-
}
|
|
127
|
-
return instance;
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
return data;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
deserializeClass(data, type) {
|
|
134
|
-
return this.deserialize(data, DecoratorMetadataUtil.findTypeName(type) ?? undefined);
|
|
135
|
-
}
|
|
136
|
-
deserializeClassArray(data, type) {
|
|
137
|
-
return this.deserialize(data, `Array<${DecoratorMetadataUtil.findTypeName(type)}>`);
|
|
138
|
-
}
|
|
139
|
-
deserialize(data, type) {
|
|
140
|
-
// polymorphism may change the actual type.
|
|
141
|
-
if (data == undefined || !type) {
|
|
142
|
-
return data;
|
|
143
|
-
}
|
|
144
|
-
const correctedTypeName = this.findCorrectType(data, type);
|
|
145
|
-
if (this._primitives.indexOf(correctedTypeName.toLowerCase()) !== -1) {
|
|
146
|
-
return data;
|
|
147
|
-
}
|
|
148
|
-
else if (correctedTypeName.lastIndexOf('Array<', 0) === 0) {
|
|
149
|
-
// string.startsWith pre es6
|
|
150
|
-
let subType = correctedTypeName.replace('Array<', ''); // Array<Type> => Type>
|
|
151
|
-
subType = subType.substring(0, subType.length - 1); // Type> => Type
|
|
152
|
-
const transformedData = [];
|
|
153
|
-
// tslint:disable-next-line:prefer-for-of
|
|
154
|
-
for (let index = 0; index < data.length; index++) {
|
|
155
|
-
const datum = data[index];
|
|
156
|
-
transformedData.push(this.deserialize(datum, subType));
|
|
157
|
-
}
|
|
158
|
-
return transformedData;
|
|
159
|
-
}
|
|
160
|
-
else if (correctedTypeName === 'Date') {
|
|
161
|
-
return new Date(data);
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
164
|
-
const enumType = TypeRegistry.get().findEnum(correctedTypeName);
|
|
165
|
-
if (enumType) {
|
|
166
|
-
// is Enum
|
|
167
|
-
return data;
|
|
168
|
-
}
|
|
169
|
-
const correctedType = TypeRegistry.get().findType(correctedTypeName);
|
|
170
|
-
if (!correctedType) {
|
|
171
|
-
// dont know the type
|
|
172
|
-
return data;
|
|
173
|
-
}
|
|
174
|
-
const instance = new correctedType();
|
|
175
|
-
const attributeTypes = correctedType.getAttributeTypeMap();
|
|
176
|
-
// tslint:disable-next-line:prefer-for-of
|
|
177
|
-
for (let index = 0; index < attributeTypes.length; index++) {
|
|
178
|
-
const attributeType = attributeTypes[index];
|
|
179
|
-
instance[attributeType.name] = this.deserialize(data[attributeType.baseName], attributeType.type);
|
|
180
|
-
}
|
|
181
|
-
return instance;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LXNlcmlhbGl6ZXIudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYXBpL3V0aWxzL29iamVjdC1zZXJpYWxpemVyLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRTFELE9BQU8sRUFBQyxRQUFRLEVBQUUscUJBQXFCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFNUQsTUFBTSxPQUFPLGdCQUFnQjtJQUE3QjtRQUVxQixpQkFBWSxHQUFHLGtCQUFrQixDQUFDO1FBQ2xDLGdCQUFXLEdBQWEsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFOUcsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIseUJBQW9CLEdBQUcsSUFBSSxDQUFDO1FBQzVCLHVCQUFrQixHQUFHLElBQUksQ0FBQztJQWlMdEMsQ0FBQzthQXZMa0IsY0FBUyxHQUFxQixJQUFJLGdCQUFnQixFQUFFLEFBQTNDLENBQTRDO0lBUXBFLElBQVcsVUFBVTtRQUNqQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLEdBQUc7UUFDYixPQUFPLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sU0FBUyxDQUFDLE1BQStGO1FBQzVHLElBQUksTUFBTSxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQUU7WUFDcEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1NBQzdDO1FBQ0QsSUFBSSxNQUFNLENBQUMsb0JBQW9CLEtBQUssU0FBUyxFQUFFO1lBQzNDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUM7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SSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekI7YUFBTTtZQUNILE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNoRSxJQUFJLFFBQVEsRUFBRTtnQkFDVixVQUFVO2dCQUNWLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7WUFFRCxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDaEIscUJBQXFCO2dCQUNyQixPQUFPLElBQUksQ0FBQzthQUNmO1lBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNyQyxNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUMsbUJBQW1CLEVBQThCLENBQUM7WUFDdkYseUNBQXlDO1lBQ3pDLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN4RCxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzVDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNyRztZQUNELE9BQU8sUUFBUSxDQUFDO1NBQ25CO0lBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2xhc3NBdHRyaWJ1dGVEZWZ9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge1R5cGVSZWdpc3RyeX0gZnJvbSAnLi4vLi4vcmVnaXN0cnkvdHlwZS5yZWdpc3RyeSc7XG5pbXBvcnQge0NsYXNzVHlwZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHtEYXRlVXRpbCwgRGVjb3JhdG9yTWV0YWRhdGFVdGlsfSBmcm9tICcuLi8uLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBPYmplY3RTZXJpYWxpemVyIHtcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IE9iamVjdFNlcmlhbGl6ZXIgPSBuZXcgT2JqZWN0U2VyaWFsaXplcigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ0NhdGVnb3J5ID0gJ09iamVjdFNlcmlhbGl6ZXInO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3ByaW1pdGl2ZXM6IHN0cmluZ1tdID0gWydzdHJpbmcnLCAnYm9vbGVhbicsICdkb3VibGUnLCAnaW50ZWdlcicsICdsb25nJywgJ2Zsb2F0JywgJ251bWJlcicsICdhbnknXTtcblxuICAgIHByaXZhdGUgZGF0ZVRpbWVJblV0YyA9IGZhbHNlO1xuICAgIHByaXZhdGUgZGF0ZVRpbWVXaXRoVGltZXpvbmUgPSB0cnVlO1xuICAgIHByaXZhdGUgZGF0ZVRpbWVXaXRoTWlsbGlzID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBnZXQgcHJpbWl0aXZlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByaW1pdGl2ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT25seSB1c2Ugb25lIGluc3RhbmNlIG9mIG9iamVjdCAob3V0IG9mIEFuZ3VsYXIgY29udGV4dClcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldCgpOiBPYmplY3RTZXJpYWxpemVyIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdFNlcmlhbGl6ZXIuX2luc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25maWd1cmUoY29uZmlnOiB7ZGF0ZVRpbWVJblV0Yz86IGJvb2xlYW47IGRhdGVUaW1lV2l0aFRpbWV6b25lPzogYm9vbGVhbjsgZGF0ZVRpbWVXaXRoTWlsbGlzPzogYm9vbGVhbn0pOiB2b2lkIHtcbiAgICAgICAgaWYgKGNvbmZpZy5kYXRlVGltZUluVXRjICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVJblV0YyA9IGNvbmZpZy5kYXRlVGltZUluVXRjO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuZGF0ZVRpbWVXaXRoVGltZXpvbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5kYXRlVGltZVdpdGhUaW1lem9uZSA9IGNvbmZpZy5kYXRlVGltZVdpdGhUaW1lem9uZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmRhdGVUaW1lV2l0aE1pbGxpcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lV2l0aE1pbGxpcyA9IGNvbmZpZy5kYXRlVGltZVdpdGhNaWxsaXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZmluZENvcnJlY3RUeXBlKGRhdGE6IGFueSwgZXhwZWN0ZWRUeXBlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGRhdGEgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWRUeXBlTmFtZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9wcmltaXRpdmVzLmluZGV4T2YoZXhwZWN0ZWRUeXBlTmFtZS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBleHBlY3RlZFR5cGVOYW1lO1xuICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZU5hbWUgPT09ICdEYXRlJykge1xuICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGVkVHlwZU5hbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbnVtVHlwZSA9IFR5cGVSZWdpc3RyeS5nZXQoKS5maW5kRW51bShleHBlY3RlZFR5cGVOYW1lKTtcbiAgICAgICAgICAgIGlmIChlbnVtVHlwZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHBlY3RlZFR5cGVOYW1lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gVHlwZVJlZ2lzdHJ5LmdldCgpLmZpbmRUeXBlKGV4cGVjdGVkVHlwZU5hbWUpO1xuICAgICAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGVkVHlwZU5hbWU7IC8vIHcvZSB3ZSBkb24ndCBrbm93IHRoZSB0eXBlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHRoZSBkaXNjcmltaW5hdG9yXG4gICAgICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yUHJvcGVydHkgPSB0eXBlLmRpc2NyaW1pbmF0b3I7XG4gICAgICAgICAgICBpZiAoZGlzY3JpbWluYXRvclByb3BlcnR5ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWRUeXBlTmFtZTsgLy8gdGhlIHR5cGUgZG9lcyBub3QgaGF2ZSBhIGRpc2NyaW1pbmF0b3IuIHVzZSBpdC5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFbZGlzY3JpbWluYXRvclByb3BlcnR5XSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yVHlwZSA9IGRhdGFbZGlzY3JpbWluYXRvclByb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IFR5cGVSZWdpc3RyeS5nZXQoKS5maW5kVHlwZShleHBlY3RlZFR5cGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXNjcmltaW5hdG9yVHlwZTsgLy8gdXNlIHRoZSB0eXBlIGdpdmVuIGluIHRoZSBkaXNjcmltaW5hdG9yXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWRUeXBlTmFtZTsgLy8gZGlzY3JpbWluYXRvciBkaWQgbm90IG1hcCB0byBhIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBleHBlY3RlZFR5cGVOYW1lOyAvLyBkaXNjcmltaW5hdG9yIHdhcyBub3QgcHJlc2VudCAob3IgYW4gZW1wdHkgc3RyaW5nKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXJpYWxpemVDbGFzczxUPihkYXRhOiBULCB0eXBlOiBDbGFzc1R5cGU8VD4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKGRhdGEsIERlY29yYXRvck1ldGFkYXRhVXRpbC5maW5kVHlwZU5hbWUodHlwZSkgPz8gdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VyaWFsaXplQ2xhc3NBcnJheTxUPihkYXRhOiBBcnJheTxUPiwgdHlwZTogQ2xhc3NUeXBlPFQ+KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZShkYXRhLCBgQXJyYXk8JHtEZWNvcmF0b3JNZXRhZGF0YVV0aWwuZmluZFR5cGVOYW1lKHR5cGUpfT5gKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VyaWFsaXplKGRhdGE6IGFueSwgdHlwZU5hbWU/OiBzdHJpbmcsIHN1YnR5cGU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGRhdGEgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlTmFtZSAmJiB0aGlzLl9wcmltaXRpdmVzLmluZGV4T2YodHlwZU5hbWUudG9Mb3dlckNhc2UoKSkgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlTmFtZSAmJiB0eXBlTmFtZS5sYXN0SW5kZXhPZignQXJyYXk8JywgMCkgPT09IDApIHtcbiAgICAgICAgICAgIC8vIHN0cmluZy5zdGFydHNXaXRoIHByZSBlczZcbiAgICAgICAgICAgIGxldCBzdWJUeXBlOiBzdHJpbmcgPSB0eXBlTmFtZS5yZXBsYWNlKCdBcnJheTwnLCAnJyk7IC8vIEFycmF5PFR5cGU+ID0+IFR5cGU+XG4gICAgICAgICAgICBzdWJUeXBlID0gc3ViVHlwZS5zdWJzdHJpbmcoMCwgc3ViVHlwZS5sZW5ndGggLSAxKTsgLy8gVHlwZT4gPT4gVHlwZVxuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWREYXRhOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnByZWZlci1mb3Itb2ZcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkYXRhLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdHVtID0gZGF0YVtpbmRleF07XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtZWREYXRhLnB1c2godGhpcy5zZXJpYWxpemUoZGF0dW0sIHN1YlR5cGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZERhdGE7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZU5hbWUgPT09ICdEYXRlJykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZU9ubHkgPSBzdWJ0eXBlPy50b0xvd2VyQ2FzZSgpID09PSAnZGF0ZSc7XG4gICAgICAgICAgICByZXR1cm4gRGF0ZVV0aWwudG9Jc29TdHJpbmcoZGF0YSwgZGF0ZU9ubHkgPyAnZGF0ZScgOiAnZGF0ZS10aW1lJywge1xuICAgICAgICAgICAgICAgIHV0YzogdGhpcy5kYXRlVGltZUluVXRjLFxuICAgICAgICAgICAgICAgIG5vVGltZXpvbmU6ICF0aGlzLmRhdGVUaW1lV2l0aFRpbWV6b25lLFxuICAgICAgICAgICAgICAgIG5vTWlsbGlzOiAhdGhpcy5kYXRlVGltZVdpdGhNaWxsaXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBlbnVtVHlwZSA9IFR5cGVSZWdpc3RyeS5nZXQoKS5maW5kRW51bSh0eXBlTmFtZSk7XG4gICAgICAgICAgICBpZiAoZW51bVR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IFR5cGVSZWdpc3RyeS5nZXQoKS5maW5kVHlwZSh0eXBlTmFtZSk7XG4gICAgICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHdlIGRvbnQga25vdyB0aGUgdHlwZVxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGFjdHVhbCB0eXBlIG9mIHRoaXMgb2JqZWN0XG4gICAgICAgICAgICBjb25zdCBjb3JyZWN0ZWRUeXBlTmFtZSA9IHRoaXMuZmluZENvcnJlY3RUeXBlKGRhdGEsIHR5cGVOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGNvcnJlY3RlZFR5cGUgPSBUeXBlUmVnaXN0cnkuZ2V0KCkuZmluZFR5cGUoY29ycmVjdGVkVHlwZU5hbWUpO1xuXG4gICAgICAgICAgICAvLyBnZXQgdGhlIG1hcCBmb3IgdGhlIGNvcnJlY3QgdHlwZS5cbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZVR5cGVzID0gY29ycmVjdGVkVHlwZS5nZXRBdHRyaWJ1dGVUeXBlTWFwKCkgYXMgQXJyYXk8Q2xhc3NBdHRyaWJ1dGVEZWY+O1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2U6IHtbaW5kZXg6IHN0cmluZ106IGFueX0gPSB7fTtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpwcmVmZXItZm9yLW9mXG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXR0cmlidXRlVHlwZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGVzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVthdHRyaWJ1dGVUeXBlLmJhc2VOYW1lXSA9IHRoaXMuc2VyaWFsaXplKGRhdGFbYXR0cmlidXRlVHlwZS5uYW1lXSwgYXR0cmlidXRlVHlwZS50eXBlLCBhdHRyaWJ1dGVUeXBlLnN1YnR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZGVzZXJpYWxpemVDbGFzczxUPihkYXRhOiBhbnksIHR5cGU6IENsYXNzVHlwZTxUPik6IFQge1xuICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZShkYXRhLCBEZWNvcmF0b3JNZXRhZGF0YVV0aWwuZmluZFR5cGVOYW1lKHR5cGUpID8/IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlc2VyaWFsaXplQ2xhc3NBcnJheTxUPihkYXRhOiBhbnksIHR5cGU6IENsYXNzVHlwZTxUPik6IEFycmF5PFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVzZXJpYWxpemUoZGF0YSwgYEFycmF5PCR7RGVjb3JhdG9yTWV0YWRhdGFVdGlsLmZpbmRUeXBlTmFtZSh0eXBlKX0+YCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlc2VyaWFsaXplKGRhdGE6IGFueSwgdHlwZT86IHN0cmluZykge1xuICAgICAgICAvLyBwb2x5bW9ycGhpc20gbWF5IGNoYW5nZSB0aGUgYWN0dWFsIHR5cGUuXG4gICAgICAgIGlmIChkYXRhID09IHVuZGVmaW5lZCB8fCAhdHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb3JyZWN0ZWRUeXBlTmFtZSA9IHRoaXMuZmluZENvcnJlY3RUeXBlKGRhdGEsIHR5cGUpO1xuXG4gICAgICAgIGlmICh0aGlzLl9wcmltaXRpdmVzLmluZGV4T2YoY29ycmVjdGVkVHlwZU5hbWUudG9Mb3dlckNhc2UoKSkgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfSBlbHNlIGlmIChjb3JyZWN0ZWRUeXBlTmFtZS5sYXN0SW5kZXhPZignQXJyYXk8JywgMCkgPT09IDApIHtcbiAgICAgICAgICAgIC8vIHN0cmluZy5zdGFydHNXaXRoIHByZSBlczZcbiAgICAgICAgICAgIGxldCBzdWJUeXBlOiBzdHJpbmcgPSBjb3JyZWN0ZWRUeXBlTmFtZS5yZXBsYWNlKCdBcnJheTwnLCAnJyk7IC8vIEFycmF5PFR5cGU+ID0+IFR5cGU+XG4gICAgICAgICAgICBzdWJUeXBlID0gc3ViVHlwZS5zdWJzdHJpbmcoMCwgc3ViVHlwZS5sZW5ndGggLSAxKTsgLy8gVHlwZT4gPT4gVHlwZVxuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWREYXRhOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnByZWZlci1mb3Itb2ZcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkYXRhLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdHVtID0gZGF0YVtpbmRleF07XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtZWREYXRhLnB1c2godGhpcy5kZXNlcmlhbGl6ZShkYXR1bSwgc3ViVHlwZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkRGF0YTtcbiAgICAgICAgfSBlbHNlIGlmIChjb3JyZWN0ZWRUeXBlTmFtZSA9PT0gJ0RhdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbnVtVHlwZSA9IFR5cGVSZWdpc3RyeS5nZXQoKS5maW5kRW51bShjb3JyZWN0ZWRUeXBlTmFtZSk7XG4gICAgICAgICAgICBpZiAoZW51bVR5cGUpIHtcbiAgICAgICAgICAgICAgICAvLyBpcyBFbnVtXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvcnJlY3RlZFR5cGUgPSBUeXBlUmVnaXN0cnkuZ2V0KCkuZmluZFR5cGUoY29ycmVjdGVkVHlwZU5hbWUpO1xuICAgICAgICAgICAgaWYgKCFjb3JyZWN0ZWRUeXBlKSB7XG4gICAgICAgICAgICAgICAgLy8gZG9udCBrbm93IHRoZSB0eXBlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb3JyZWN0ZWRUeXBlKCk7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVUeXBlcyA9IGNvcnJlY3RlZFR5cGUuZ2V0QXR0cmlidXRlVHlwZU1hcCgpIGFzIEFycmF5PENsYXNzQXR0cmlidXRlRGVmPjtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpwcmVmZXItZm9yLW9mXG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXR0cmlidXRlVHlwZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGVzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVthdHRyaWJ1dGVUeXBlLm5hbWVdID0gdGhpcy5kZXNlcmlhbGl6ZShkYXRhW2F0dHJpYnV0ZVR5cGUuYmFzZU5hbWVdLCBhdHRyaWJ1dGVUeXBlLnR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
|