@lenne.tech/ng-base 12.1.0 → 13.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{esm2015/lenne.tech-ng-base.js → esm2020/lenne.tech-ng-base.mjs} +0 -0
- package/{esm2015/src/lib/base/base.module.js → esm2020/lib/base/base.module.mjs} +39 -8
- package/{esm2015/lib/base/classes/basic-user.class.js → esm2020/lib/base/classes/basic-user.class.mjs} +0 -0
- package/{esm2015/lib/base/classes/graphql-enum.class.js → esm2020/lib/base/classes/graphql-enum.class.mjs} +0 -0
- package/esm2020/lib/base/classes/graphql-meta.class.mjs +171 -0
- package/{esm2015/lib/base/classes/graphql-type.class.js → esm2020/lib/base/classes/graphql-type.class.mjs} +0 -0
- package/esm2020/lib/base/classes/helper.class.mjs +295 -0
- package/{esm2015/lib/base/classes/standard.class.js → esm2020/lib/base/classes/standard.class.mjs} +0 -0
- package/esm2020/lib/base/directives/context-menu.directive.mjs +109 -0
- package/esm2020/lib/base/directives/lazy-load.directive.mjs +45 -0
- package/esm2020/lib/base/directives/match-height.directive.mjs +79 -0
- package/esm2020/lib/base/directives/resizable.directive.mjs +90 -0
- package/{esm2015/lib/base/enums/comparison-operator.enum.js → esm2020/lib/base/enums/comparison-operator.enum.mjs} +0 -0
- package/{esm2015/lib/base/enums/graphql-request-type.enum.js → esm2020/lib/base/enums/graphql-request-type.enum.mjs} +0 -0
- package/{esm2015/lib/base/enums/logical-operator.enum.js → esm2020/lib/base/enums/logical-operator.enum.mjs} +0 -0
- package/{esm2015/lib/base/enums/sort-order.enum.js → esm2020/lib/base/enums/sort-order.enum.mjs} +0 -0
- package/{esm2015/lib/base/factories/apollo-options.factory.js → esm2020/lib/base/factories/apollo-options.factory.mjs} +0 -0
- package/esm2020/lib/base/guards/auth.guard.mjs +61 -0
- package/esm2020/lib/base/guards/can-deactivate.guard.mjs +16 -0
- package/esm2020/lib/base/guards/logout.guard.mjs +32 -0
- package/{esm2015/lib/base/index.js → esm2020/lib/base/index.mjs} +0 -0
- package/{esm2015/lib/base/interfaces/base-module-config.interface.js → esm2020/lib/base/interfaces/base-module-config.interface.mjs} +0 -0
- package/{esm2015/lib/base/interfaces/can-component-deactivate.interface.js → esm2020/lib/base/interfaces/can-component-deactivate.interface.mjs} +0 -0
- package/{esm2015/lib/base/interfaces/combined-filter-input.interface.js → esm2020/lib/base/interfaces/combined-filter-input.interface.mjs} +0 -0
- package/{esm2015/lib/base/interfaces/field-object.interface.js → esm2020/lib/base/interfaces/field-object.interface.mjs} +0 -0
- package/{esm2015/lib/base/interfaces/field.interface.js → esm2020/lib/base/interfaces/field.interface.mjs} +0 -0
- package/{esm2015/lib/base/interfaces/filter-input.interface.js → esm2020/lib/base/interfaces/filter-input.interface.mjs} +0 -0
- package/{esm2015/lib/base/interfaces/find-args.interface.js → esm2020/lib/base/interfaces/find-args.interface.mjs} +0 -0
- package/{esm2015/lib/base/interfaces/graphql-options.interface.js → esm2020/lib/base/interfaces/graphql-options.interface.mjs} +0 -0
- package/{esm2015/lib/base/interfaces/graphql-plus-options.interfacen.js → esm2020/lib/base/interfaces/graphql-plus-options.interfacen.mjs} +0 -0
- package/{esm2015/lib/base/interfaces/graphql-type-collection.interface.js → esm2020/lib/base/interfaces/graphql-type-collection.interface.mjs} +0 -0
- package/{esm2015/lib/base/interfaces/single-filter-input.interface.js → esm2020/lib/base/interfaces/single-filter-input.interface.mjs} +0 -0
- package/{esm2015/lib/base/interfaces/sort-input.interface.js → esm2020/lib/base/interfaces/sort-input.interface.mjs} +0 -0
- package/esm2020/lib/base/pipes/ellipses.pipe.mjs +22 -0
- package/esm2020/lib/base/pipes/safe-html.pipe.mjs +21 -0
- package/{esm2015/lib/base/public-api.js → esm2020/lib/base/public-api.mjs} +0 -0
- package/{esm2015/lib/base/services/auth.service.js → esm2020/lib/base/services/auth.service.mjs} +14 -17
- package/{esm2015/lib/base/services/fullscreen.service.js → esm2020/lib/base/services/fullscreen.service.mjs} +9 -8
- package/esm2020/lib/base/services/graphql-meta.service.mjs +123 -0
- package/esm2020/lib/base/services/graphql-plus.service.mjs +84 -0
- package/esm2020/lib/base/services/graphql.service.mjs +441 -0
- package/esm2020/lib/base/services/image.service.mjs +102 -0
- package/esm2020/lib/base/services/loader.service.mjs +29 -0
- package/esm2020/lib/base/services/scroll.service.mjs +179 -0
- package/esm2020/lib/base/services/seo.service.mjs +97 -0
- package/esm2020/lib/base/services/storage.service.mjs +132 -0
- package/esm2020/lib/base/services/ws.service.mjs +17 -0
- package/{esm2015/lib/base/types/storage.type.js → esm2020/lib/base/types/storage.type.mjs} +0 -0
- package/{esm2015/lib/base/validators/must-match.validator.js → esm2020/lib/base/validators/must-match.validator.mjs} +0 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/esm2020/src/lib/base/base.module.mjs +97 -0
- package/{esm2015/src/lib/base/classes/basic-user.class.js → esm2020/src/lib/base/classes/basic-user.class.mjs} +0 -0
- package/{esm2015/src/lib/base/classes/graphql-enum.class.js → esm2020/src/lib/base/classes/graphql-enum.class.mjs} +0 -0
- package/esm2020/src/lib/base/classes/graphql-meta.class.mjs +171 -0
- package/{esm2015/src/lib/base/classes/graphql-type.class.js → esm2020/src/lib/base/classes/graphql-type.class.mjs} +0 -0
- package/esm2020/src/lib/base/classes/helper.class.mjs +295 -0
- package/{esm2015/src/lib/base/classes/standard.class.js → esm2020/src/lib/base/classes/standard.class.mjs} +0 -0
- package/esm2020/src/lib/base/directives/context-menu.directive.mjs +109 -0
- package/esm2020/src/lib/base/directives/lazy-load.directive.mjs +45 -0
- package/esm2020/src/lib/base/directives/match-height.directive.mjs +79 -0
- package/esm2020/src/lib/base/directives/resizable.directive.mjs +90 -0
- package/{esm2015/src/lib/base/enums/comparison-operator.enum.js → esm2020/src/lib/base/enums/comparison-operator.enum.mjs} +0 -0
- package/{esm2015/src/lib/base/enums/graphql-request-type.enum.js → esm2020/src/lib/base/enums/graphql-request-type.enum.mjs} +0 -0
- package/{esm2015/src/lib/base/enums/logical-operator.enum.js → esm2020/src/lib/base/enums/logical-operator.enum.mjs} +0 -0
- package/{esm2015/src/lib/base/enums/sort-order.enum.js → esm2020/src/lib/base/enums/sort-order.enum.mjs} +0 -0
- package/{esm2015/src/lib/base/factories/apollo-options.factory.js → esm2020/src/lib/base/factories/apollo-options.factory.mjs} +0 -0
- package/esm2020/src/lib/base/guards/auth.guard.mjs +61 -0
- package/esm2020/src/lib/base/guards/can-deactivate.guard.mjs +16 -0
- package/esm2020/src/lib/base/guards/logout.guard.mjs +32 -0
- package/{esm2015/src/lib/base/interfaces/base-module-config.interface.js → esm2020/src/lib/base/interfaces/base-module-config.interface.mjs} +0 -0
- package/{esm2015/src/lib/base/interfaces/can-component-deactivate.interface.js → esm2020/src/lib/base/interfaces/can-component-deactivate.interface.mjs} +0 -0
- package/{esm2015/src/lib/base/interfaces/combined-filter-input.interface.js → esm2020/src/lib/base/interfaces/combined-filter-input.interface.mjs} +0 -0
- package/{esm2015/src/lib/base/interfaces/field-object.interface.js → esm2020/src/lib/base/interfaces/field-object.interface.mjs} +0 -0
- package/{esm2015/src/lib/base/interfaces/field.interface.js → esm2020/src/lib/base/interfaces/field.interface.mjs} +0 -0
- package/{esm2015/src/lib/base/interfaces/filter-input.interface.js → esm2020/src/lib/base/interfaces/filter-input.interface.mjs} +0 -0
- package/{esm2015/src/lib/base/interfaces/find-args.interface.js → esm2020/src/lib/base/interfaces/find-args.interface.mjs} +0 -0
- package/{esm2015/src/lib/base/interfaces/graphql-options.interface.js → esm2020/src/lib/base/interfaces/graphql-options.interface.mjs} +0 -0
- package/{esm2015/src/lib/base/interfaces/graphql-plus-options.interfacen.js → esm2020/src/lib/base/interfaces/graphql-plus-options.interfacen.mjs} +0 -0
- package/{esm2015/src/lib/base/interfaces/graphql-type-collection.interface.js → esm2020/src/lib/base/interfaces/graphql-type-collection.interface.mjs} +0 -0
- package/{esm2015/src/lib/base/interfaces/single-filter-input.interface.js → esm2020/src/lib/base/interfaces/single-filter-input.interface.mjs} +0 -0
- package/{esm2015/src/lib/base/interfaces/sort-input.interface.js → esm2020/src/lib/base/interfaces/sort-input.interface.mjs} +0 -0
- package/{esm2015/src/lib/base/lenne.tech-ng-base-src-lib-base.js → esm2020/src/lib/base/lenne.tech-ng-base-src-lib-base.mjs} +0 -0
- package/esm2020/src/lib/base/pipes/ellipses.pipe.mjs +22 -0
- package/esm2020/src/lib/base/pipes/safe-html.pipe.mjs +21 -0
- package/{esm2015/src/lib/base/public-api.js → esm2020/src/lib/base/public-api.mjs} +0 -0
- package/{esm2015/src/lib/base/services/auth.service.js → esm2020/src/lib/base/services/auth.service.mjs} +14 -17
- package/{esm2015/src/lib/base/services/fullscreen.service.js → esm2020/src/lib/base/services/fullscreen.service.mjs} +9 -8
- package/esm2020/src/lib/base/services/graphql-meta.service.mjs +123 -0
- package/esm2020/src/lib/base/services/graphql-plus.service.mjs +84 -0
- package/esm2020/src/lib/base/services/graphql.service.mjs +441 -0
- package/esm2020/src/lib/base/services/image.service.mjs +102 -0
- package/esm2020/src/lib/base/services/loader.service.mjs +29 -0
- package/esm2020/src/lib/base/services/scroll.service.mjs +179 -0
- package/esm2020/src/lib/base/services/seo.service.mjs +97 -0
- package/esm2020/src/lib/base/services/storage.service.mjs +132 -0
- package/esm2020/src/lib/base/services/ws.service.mjs +17 -0
- package/{esm2015/src/lib/base/types/storage.type.js → esm2020/src/lib/base/types/storage.type.mjs} +0 -0
- package/{esm2015/src/lib/base/validators/must-match.validator.js → esm2020/src/lib/base/validators/must-match.validator.mjs} +0 -0
- package/fesm2015/{lenne.tech-ng-base-src-lib-base.js → lenne.tech-ng-base-src-lib-base.mjs} +238 -195
- package/fesm2015/lenne.tech-ng-base-src-lib-base.mjs.map +1 -0
- package/fesm2015/{lenne.tech-ng-base.js → lenne.tech-ng-base.mjs} +238 -195
- package/fesm2015/lenne.tech-ng-base.mjs.map +1 -0
- package/fesm2020/lenne.tech-ng-base-src-lib-base.mjs +2524 -0
- package/fesm2020/lenne.tech-ng-base-src-lib-base.mjs.map +1 -0
- package/fesm2020/lenne.tech-ng-base.mjs +2526 -0
- package/fesm2020/lenne.tech-ng-base.mjs.map +1 -0
- package/lenne.tech-ng-base.d.ts +1 -0
- package/lib/base/base.module.d.ts +10 -0
- package/lib/base/classes/graphql-meta.class.d.ts +2 -4
- package/lib/base/directives/context-menu.directive.d.ts +3 -0
- package/lib/base/directives/lazy-load.directive.d.ts +3 -0
- package/lib/base/directives/match-height.directive.d.ts +3 -0
- package/lib/base/directives/resizable.directive.d.ts +3 -0
- package/lib/base/guards/auth.guard.d.ts +3 -0
- package/lib/base/guards/can-deactivate.guard.d.ts +3 -0
- package/lib/base/guards/logout.guard.d.ts +3 -0
- package/lib/base/pipes/ellipses.pipe.d.ts +3 -0
- package/lib/base/pipes/safe-html.pipe.d.ts +3 -0
- package/lib/base/services/auth.service.d.ts +3 -0
- package/lib/base/services/fullscreen.service.d.ts +3 -0
- package/lib/base/services/graphql-meta.service.d.ts +3 -0
- package/lib/base/services/graphql-plus.service.d.ts +3 -0
- package/lib/base/services/graphql.service.d.ts +3 -0
- package/lib/base/services/image.service.d.ts +3 -0
- package/lib/base/services/loader.service.d.ts +3 -0
- package/lib/base/services/scroll.service.d.ts +3 -0
- package/lib/base/services/seo.service.d.ts +3 -0
- package/lib/base/services/storage.service.d.ts +3 -0
- package/lib/base/services/ws.service.d.ts +3 -0
- package/package.json +34 -14
- package/src/lib/base/base.module.d.ts +10 -0
- package/src/lib/base/classes/graphql-meta.class.d.ts +2 -4
- package/src/lib/base/directives/context-menu.directive.d.ts +3 -0
- package/src/lib/base/directives/lazy-load.directive.d.ts +3 -0
- package/src/lib/base/directives/match-height.directive.d.ts +3 -0
- package/src/lib/base/directives/resizable.directive.d.ts +3 -0
- package/src/lib/base/guards/auth.guard.d.ts +3 -0
- package/src/lib/base/guards/can-deactivate.guard.d.ts +3 -0
- package/src/lib/base/guards/logout.guard.d.ts +3 -0
- package/src/lib/base/lenne.tech-ng-base-src-lib-base.d.ts +1 -0
- package/src/lib/base/package.json +5 -6
- package/src/lib/base/pipes/ellipses.pipe.d.ts +3 -0
- package/src/lib/base/pipes/safe-html.pipe.d.ts +3 -0
- package/src/lib/base/services/auth.service.d.ts +3 -0
- package/src/lib/base/services/fullscreen.service.d.ts +3 -0
- package/src/lib/base/services/graphql-meta.service.d.ts +3 -0
- package/src/lib/base/services/graphql-plus.service.d.ts +3 -0
- package/src/lib/base/services/graphql.service.d.ts +3 -0
- package/src/lib/base/services/image.service.d.ts +3 -0
- package/src/lib/base/services/loader.service.d.ts +3 -0
- package/src/lib/base/services/scroll.service.d.ts +3 -0
- package/src/lib/base/services/seo.service.d.ts +3 -0
- package/src/lib/base/services/storage.service.d.ts +3 -0
- package/src/lib/base/services/ws.service.d.ts +3 -0
- package/bundles/lenne.tech-ng-base-src-lib-base.umd.js +0 -3152
- package/bundles/lenne.tech-ng-base-src-lib-base.umd.js.map +0 -1
- package/bundles/lenne.tech-ng-base.umd.js +0 -3154
- package/bundles/lenne.tech-ng-base.umd.js.map +0 -1
- package/esm2015/lib/base/base.module.js +0 -66
- package/esm2015/lib/base/classes/graphql-meta.class.js +0 -156
- package/esm2015/lib/base/classes/helper.class.js +0 -290
- package/esm2015/lib/base/directives/context-menu.directive.js +0 -104
- package/esm2015/lib/base/directives/lazy-load.directive.js +0 -43
- package/esm2015/lib/base/directives/match-height.directive.js +0 -78
- package/esm2015/lib/base/directives/resizable.directive.js +0 -89
- package/esm2015/lib/base/guards/auth.guard.js +0 -61
- package/esm2015/lib/base/guards/can-deactivate.guard.js +0 -13
- package/esm2015/lib/base/guards/logout.guard.js +0 -33
- package/esm2015/lib/base/pipes/ellipses.pipe.js +0 -18
- package/esm2015/lib/base/pipes/safe-html.pipe.js +0 -20
- package/esm2015/lib/base/services/graphql-meta.service.js +0 -116
- package/esm2015/lib/base/services/graphql-plus.service.js +0 -90
- package/esm2015/lib/base/services/graphql.service.js +0 -423
- package/esm2015/lib/base/services/image.service.js +0 -99
- package/esm2015/lib/base/services/loader.service.js +0 -27
- package/esm2015/lib/base/services/scroll.service.js +0 -172
- package/esm2015/lib/base/services/seo.service.js +0 -100
- package/esm2015/lib/base/services/storage.service.js +0 -131
- package/esm2015/lib/base/services/ws.service.js +0 -16
- package/esm2015/src/lib/base/classes/graphql-meta.class.js +0 -156
- package/esm2015/src/lib/base/classes/helper.class.js +0 -290
- package/esm2015/src/lib/base/directives/context-menu.directive.js +0 -104
- package/esm2015/src/lib/base/directives/lazy-load.directive.js +0 -43
- package/esm2015/src/lib/base/directives/match-height.directive.js +0 -78
- package/esm2015/src/lib/base/directives/resizable.directive.js +0 -89
- package/esm2015/src/lib/base/guards/auth.guard.js +0 -61
- package/esm2015/src/lib/base/guards/can-deactivate.guard.js +0 -13
- package/esm2015/src/lib/base/guards/logout.guard.js +0 -33
- package/esm2015/src/lib/base/pipes/ellipses.pipe.js +0 -18
- package/esm2015/src/lib/base/pipes/safe-html.pipe.js +0 -20
- package/esm2015/src/lib/base/services/graphql-meta.service.js +0 -116
- package/esm2015/src/lib/base/services/graphql-plus.service.js +0 -90
- package/esm2015/src/lib/base/services/graphql.service.js +0 -423
- package/esm2015/src/lib/base/services/image.service.js +0 -99
- package/esm2015/src/lib/base/services/loader.service.js +0 -27
- package/esm2015/src/lib/base/services/scroll.service.js +0 -172
- package/esm2015/src/lib/base/services/seo.service.js +0 -100
- package/esm2015/src/lib/base/services/storage.service.js +0 -131
- package/esm2015/src/lib/base/services/ws.service.js +0 -16
- package/fesm2015/lenne.tech-ng-base-src-lib-base.js.map +0 -1
- package/fesm2015/lenne.tech-ng-base.js.map +0 -1
- package/lenne.tech-ng-base.metadata.json +0 -1
- package/src/lib/base/lenne.tech-ng-base-src-lib-base.metadata.json +0 -1
|
@@ -1,423 +0,0 @@
|
|
|
1
|
-
import { Apollo, gql } from 'apollo-angular';
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { GraphQLRequestType } from '../enums/graphql-request-type.enum';
|
|
4
|
-
import { Observable, throwError } from 'rxjs';
|
|
5
|
-
import { GraphQLMetaService } from './graphql-meta.service';
|
|
6
|
-
import { GraphQLEnum } from '../classes/graphql-enum.class';
|
|
7
|
-
import { GraphQLType } from '../classes/graphql-type.class';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "apollo-angular";
|
|
10
|
-
import * as i2 from "./graphql-meta.service";
|
|
11
|
-
/**
|
|
12
|
-
* GraphQL service
|
|
13
|
-
*/
|
|
14
|
-
export class GraphQLService {
|
|
15
|
-
/**
|
|
16
|
-
* Include services
|
|
17
|
-
*/
|
|
18
|
-
constructor(apollo, graphQLMetaService) {
|
|
19
|
-
this.apollo = apollo;
|
|
20
|
-
this.graphQLMetaService = graphQLMetaService;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* GraphQL request
|
|
24
|
-
*/
|
|
25
|
-
graphQl(graphql, options = {}) {
|
|
26
|
-
// Check arguments
|
|
27
|
-
if (!graphql) {
|
|
28
|
-
throwError('Missing graphql argument');
|
|
29
|
-
}
|
|
30
|
-
// Get config
|
|
31
|
-
const config = Object.assign({ arguments: null, fields: null, log: false, model: null, type: GraphQLRequestType.QUERY }, options);
|
|
32
|
-
// Convert class to Object for arguments
|
|
33
|
-
if (typeof config.arguments === 'function') {
|
|
34
|
-
config.arguments = new config.arguments();
|
|
35
|
-
}
|
|
36
|
-
// Convert class to Object for fields
|
|
37
|
-
if (typeof config.fields === 'function') {
|
|
38
|
-
config.fields = new config.fields();
|
|
39
|
-
}
|
|
40
|
-
// Log
|
|
41
|
-
if (config.log) {
|
|
42
|
-
console.log({ config });
|
|
43
|
-
}
|
|
44
|
-
// Send request
|
|
45
|
-
return new Observable((subscriber) => {
|
|
46
|
-
// Get meta
|
|
47
|
-
this.graphQLMetaService.getMeta({ log: config.log }).subscribe((meta) => {
|
|
48
|
-
// Prepare fields
|
|
49
|
-
let fields;
|
|
50
|
-
let allowedFields;
|
|
51
|
-
// Log meta
|
|
52
|
-
if (config.log) {
|
|
53
|
-
console.log({ meta });
|
|
54
|
-
}
|
|
55
|
-
if (config.fields) {
|
|
56
|
-
allowedFields = meta.getFields(graphql, { type: config.type });
|
|
57
|
-
// Log meta
|
|
58
|
-
if (config.log) {
|
|
59
|
-
console.log({ allowedFields });
|
|
60
|
-
}
|
|
61
|
-
const fieldsData = this.prepareFields(config.fields, {
|
|
62
|
-
allowed: allowedFields,
|
|
63
|
-
});
|
|
64
|
-
// Log fields data
|
|
65
|
-
if (config.log) {
|
|
66
|
-
fieldsData.usedFields.sort();
|
|
67
|
-
fieldsData.schemaFields.sort();
|
|
68
|
-
const filtered = fieldsData.schemaFields.filter((field) => !fieldsData.usedFields.includes(field));
|
|
69
|
-
const unused = this.graphQLTypeCollectionToStringArray(allowedFields).filter((field) => !fieldsData.usedFields.includes(field));
|
|
70
|
-
console.log({ fieldsData, filtered, unused });
|
|
71
|
-
}
|
|
72
|
-
fields = fieldsData.fieldsString;
|
|
73
|
-
}
|
|
74
|
-
if (fields && !fields.startsWith('{')) {
|
|
75
|
-
fields = '{' + fields + '\n}';
|
|
76
|
-
}
|
|
77
|
-
// Log fields
|
|
78
|
-
if (config.log) {
|
|
79
|
-
console.log({ fields });
|
|
80
|
-
}
|
|
81
|
-
// Get allowed args
|
|
82
|
-
const allowedArgs = meta.getArgs(graphql, { type: config.type });
|
|
83
|
-
// Log allowed args
|
|
84
|
-
if (config.log) {
|
|
85
|
-
console.log({ allowedArgs });
|
|
86
|
-
}
|
|
87
|
-
const argsData = this.prepareArguments(config.arguments, {
|
|
88
|
-
allowed: allowedArgs,
|
|
89
|
-
});
|
|
90
|
-
// Log args data
|
|
91
|
-
if (config.log) {
|
|
92
|
-
argsData.usedArgs.sort();
|
|
93
|
-
argsData.schemaArgs.sort();
|
|
94
|
-
const filtered = argsData.schemaArgs.filter((field) => !argsData.usedArgs.includes(field));
|
|
95
|
-
const unused = this.graphQLTypeCollectionToStringArray(allowedArgs)
|
|
96
|
-
.sort()
|
|
97
|
-
.filter((field) => !argsData.usedArgs.includes(field));
|
|
98
|
-
console.log({ argsData, filtered, unused });
|
|
99
|
-
}
|
|
100
|
-
const args = (argsData === null || argsData === void 0 ? void 0 : argsData.argsString) || '';
|
|
101
|
-
// Log
|
|
102
|
-
if (config.log) {
|
|
103
|
-
console.log({ graphQL: graphql, args, fields, type: config.type });
|
|
104
|
-
}
|
|
105
|
-
// Prepare request
|
|
106
|
-
const documentNode = fields
|
|
107
|
-
? gql(config.type + '{\n' + graphql + args + fields + '\n}')
|
|
108
|
-
: gql(config.type + '{\n' + graphql + args + '\n}');
|
|
109
|
-
// Log
|
|
110
|
-
if (config.log) {
|
|
111
|
-
console.log({ documentNode });
|
|
112
|
-
}
|
|
113
|
-
const request = {};
|
|
114
|
-
request[config.type] = documentNode;
|
|
115
|
-
// Log
|
|
116
|
-
if (config.log) {
|
|
117
|
-
console.log({ request });
|
|
118
|
-
}
|
|
119
|
-
let func;
|
|
120
|
-
if (config.type === GraphQLRequestType.MUTATION) {
|
|
121
|
-
func = 'mutate';
|
|
122
|
-
request[config.type] = documentNode;
|
|
123
|
-
}
|
|
124
|
-
else if (config.type === GraphQLRequestType.SUBSCRIPTION) {
|
|
125
|
-
func = 'subscribe';
|
|
126
|
-
request.query = documentNode;
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
func = config.type;
|
|
130
|
-
request[config.type] = documentNode;
|
|
131
|
-
}
|
|
132
|
-
this.apollo[func](request).subscribe((result) => {
|
|
133
|
-
var _a;
|
|
134
|
-
const data = ((_a = result === null || result === void 0 ? void 0 : result.data) === null || _a === void 0 ? void 0 : _a[graphql]) !== undefined ? result.data[graphql] : result;
|
|
135
|
-
// Direct data
|
|
136
|
-
if (!config.model) {
|
|
137
|
-
subscriber.next(data);
|
|
138
|
-
}
|
|
139
|
-
// Map data as array
|
|
140
|
-
else if (Array.isArray(data)) {
|
|
141
|
-
subscriber.next(data.map((item) => {
|
|
142
|
-
return config.model.map(item);
|
|
143
|
-
}));
|
|
144
|
-
}
|
|
145
|
-
// Map data
|
|
146
|
-
else {
|
|
147
|
-
subscriber.next(config.model.map(data));
|
|
148
|
-
}
|
|
149
|
-
if (config.type !== GraphQLRequestType.SUBSCRIPTION) {
|
|
150
|
-
// Done
|
|
151
|
-
subscriber.complete();
|
|
152
|
-
}
|
|
153
|
-
}, (error) => {
|
|
154
|
-
subscriber.error(error);
|
|
155
|
-
subscriber.complete();
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Get fields / args from IGraphQLTypeCollection
|
|
162
|
-
*/
|
|
163
|
-
graphQLTypeCollectionToStringArray(collection, current = '', result = [], cacheNode = []) {
|
|
164
|
-
if (collection) {
|
|
165
|
-
if (collection instanceof GraphQLType) {
|
|
166
|
-
result.push(current);
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
if (current === null || current === void 0 ? void 0 : current.includes('.')) {
|
|
170
|
-
cacheNode.push(current.split('.')[1]);
|
|
171
|
-
}
|
|
172
|
-
else if (current) {
|
|
173
|
-
cacheNode.push(current);
|
|
174
|
-
}
|
|
175
|
-
for (const key of Object.keys(collection)) {
|
|
176
|
-
if (current === key || cacheNode.includes(key)) {
|
|
177
|
-
continue;
|
|
178
|
-
}
|
|
179
|
-
this.graphQLTypeCollectionToStringArray(collection[key], current ? current + '.' + key : key, result, cacheNode);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
return result;
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Prepare arguments for GraphQL request
|
|
187
|
-
*/
|
|
188
|
-
prepareArguments(args, options = {}) {
|
|
189
|
-
// Init config variables
|
|
190
|
-
const { allowed, level, parent, schemaArgs, usedArgs } = Object.assign({ allowed: null, level: 1, parent: '', schemaArgs: [], usedArgs: [] }, options);
|
|
191
|
-
// Check args
|
|
192
|
-
if (args === undefined || args === null) {
|
|
193
|
-
return { argsString: '', schemaArgs, usedArgs };
|
|
194
|
-
}
|
|
195
|
-
// Init args
|
|
196
|
-
const result = [];
|
|
197
|
-
// Process array
|
|
198
|
-
if (Array.isArray(args)) {
|
|
199
|
-
const allowedKeys = allowed ? Object.keys(allowed) : null;
|
|
200
|
-
for (const item of args) {
|
|
201
|
-
let key = null;
|
|
202
|
-
if (allowed) {
|
|
203
|
-
if (allowed.length < 1) {
|
|
204
|
-
break;
|
|
205
|
-
}
|
|
206
|
-
key = allowedKeys === null || allowedKeys === void 0 ? void 0 : allowedKeys.shift();
|
|
207
|
-
}
|
|
208
|
-
// Process value
|
|
209
|
-
result.push(this.prepareArguments(item, {
|
|
210
|
-
allowed: key ? allowed[key] : null,
|
|
211
|
-
level: level + 1,
|
|
212
|
-
parent: parent + key + '.',
|
|
213
|
-
schemaArgs,
|
|
214
|
-
usedArgs,
|
|
215
|
-
}).argsString);
|
|
216
|
-
}
|
|
217
|
-
// Encapsulation of the array result
|
|
218
|
-
if (result.length) {
|
|
219
|
-
// Complete result, encapsulated via round brackets
|
|
220
|
-
if (level === 1) {
|
|
221
|
-
return { argsString: '(' + result.join(', ') + ')', schemaArgs, usedArgs };
|
|
222
|
-
}
|
|
223
|
-
// Deeper result part, encapsulated via square brackets
|
|
224
|
-
else {
|
|
225
|
-
return { argsString: '[' + result.join(', ') + ']', schemaArgs, usedArgs };
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
// Process object
|
|
230
|
-
else if (typeof args === 'object') {
|
|
231
|
-
// Check object is empty
|
|
232
|
-
if (args && Object.keys(args).length === 0 && Object.getPrototypeOf(args) === Object.prototype) {
|
|
233
|
-
return { argsString: '{}', schemaArgs, usedArgs };
|
|
234
|
-
}
|
|
235
|
-
// Process all object entries
|
|
236
|
-
for (const [key, value] of Object.entries(args)) {
|
|
237
|
-
// Init data for current entry
|
|
238
|
-
const currentKey = parent + key;
|
|
239
|
-
schemaArgs.push(currentKey);
|
|
240
|
-
// If the allowed key handling is enabled and the current key is not included in the list of allowed keys,
|
|
241
|
-
// the current key will be skipped
|
|
242
|
-
if (allowed && !allowed[key]) {
|
|
243
|
-
continue;
|
|
244
|
-
}
|
|
245
|
-
// Skip value if not exists
|
|
246
|
-
if (value === undefined || value === null) {
|
|
247
|
-
continue;
|
|
248
|
-
}
|
|
249
|
-
// Add current key to metadata
|
|
250
|
-
usedArgs.push(currentKey);
|
|
251
|
-
// Process GraphQLEnum
|
|
252
|
-
if (value instanceof GraphQLEnum) {
|
|
253
|
-
result.push(key + ':' + value.value);
|
|
254
|
-
continue;
|
|
255
|
-
}
|
|
256
|
-
// Process array
|
|
257
|
-
else if (Array.isArray(value)) {
|
|
258
|
-
result.push(key +
|
|
259
|
-
': [' +
|
|
260
|
-
value.map((item) => this.prepareArguments(item, {
|
|
261
|
-
allowed: allowed[key],
|
|
262
|
-
level: level + 1,
|
|
263
|
-
parent: currentKey + '.',
|
|
264
|
-
schemaArgs,
|
|
265
|
-
usedArgs,
|
|
266
|
-
}).argsString) +
|
|
267
|
-
']');
|
|
268
|
-
continue;
|
|
269
|
-
}
|
|
270
|
-
// Prepare additional result string
|
|
271
|
-
let additionalResult = key + ': ';
|
|
272
|
-
// Value is a date object
|
|
273
|
-
if (typeof value === 'object' && Object.prototype.toString.call(value) === '[object Date]') {
|
|
274
|
-
additionalResult += `"""${value.toString()}"""`;
|
|
275
|
-
}
|
|
276
|
-
// Value is a string
|
|
277
|
-
else if (typeof value === 'string') {
|
|
278
|
-
// Enum (doesn't need quotation marks)
|
|
279
|
-
if (allowed[key].isEnum) {
|
|
280
|
-
additionalResult += value;
|
|
281
|
-
}
|
|
282
|
-
// String
|
|
283
|
-
else {
|
|
284
|
-
additionalResult += `"""${value.replace(/"/g, '\\"')}"""`;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
// Value is a simple boolean or a number
|
|
288
|
-
else if (typeof value === 'boolean' || typeof value === 'number') {
|
|
289
|
-
additionalResult += value;
|
|
290
|
-
}
|
|
291
|
-
// Others
|
|
292
|
-
else {
|
|
293
|
-
additionalResult += this.prepareArguments(value, {
|
|
294
|
-
allowed: allowed[key],
|
|
295
|
-
level: level + 1,
|
|
296
|
-
parent: currentKey + '.',
|
|
297
|
-
schemaArgs,
|
|
298
|
-
usedArgs,
|
|
299
|
-
}).argsString;
|
|
300
|
-
}
|
|
301
|
-
// Push deeper part into result array
|
|
302
|
-
result.push(additionalResult);
|
|
303
|
-
}
|
|
304
|
-
// Encapsulation of the object result
|
|
305
|
-
if (result.length) {
|
|
306
|
-
// Complete result, encapsulated via round brackets
|
|
307
|
-
if (level === 1) {
|
|
308
|
-
return { argsString: '(' + result.join(', ') + ')', schemaArgs, usedArgs };
|
|
309
|
-
}
|
|
310
|
-
// Deeper result part, encapsulated via curly brackets
|
|
311
|
-
else {
|
|
312
|
-
return { argsString: '{' + result.join(', ') + '}', schemaArgs, usedArgs };
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
// Prepare and process other / unknown values as JSON
|
|
317
|
-
else {
|
|
318
|
-
return { argsString: JSON.stringify(args), schemaArgs, usedArgs };
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
|
-
* Prepare fields for GraphQL request
|
|
323
|
-
*/
|
|
324
|
-
prepareFields(fields, options = {}) {
|
|
325
|
-
// Config
|
|
326
|
-
const { allowed, parent, schemaFields, spaces, tab, usedFields } = Object.assign({ allowed: null, parent: '', schemaFields: [], spaces: 2, tab: 1, usedFields: [] }, options);
|
|
327
|
-
// Init fields string
|
|
328
|
-
let fieldsString = '';
|
|
329
|
-
// Check fields
|
|
330
|
-
if (!fields) {
|
|
331
|
-
return { fieldsString, schemaFields, usedFields };
|
|
332
|
-
}
|
|
333
|
-
// Process string
|
|
334
|
-
if (typeof fields === 'string') {
|
|
335
|
-
if (allowed &&
|
|
336
|
-
((typeof allowed === 'string' && allowed !== fields) || (typeof allowed === 'object' && !allowed[fields]))) {
|
|
337
|
-
return { fieldsString, schemaFields, usedFields };
|
|
338
|
-
}
|
|
339
|
-
return { fieldsString: '\n' + ' '.repeat(spaces).repeat(tab) + fields, schemaFields, usedFields };
|
|
340
|
-
}
|
|
341
|
-
// Process array
|
|
342
|
-
else if (Array.isArray(fields)) {
|
|
343
|
-
for (const item of fields) {
|
|
344
|
-
if (typeof item === 'object') {
|
|
345
|
-
fieldsString =
|
|
346
|
-
fieldsString +
|
|
347
|
-
this.prepareFields(item, {
|
|
348
|
-
allowed,
|
|
349
|
-
parent,
|
|
350
|
-
spaces,
|
|
351
|
-
schemaFields,
|
|
352
|
-
tab: tab + 1,
|
|
353
|
-
usedFields,
|
|
354
|
-
}).fieldsString;
|
|
355
|
-
continue;
|
|
356
|
-
}
|
|
357
|
-
const currentPath = parent + item;
|
|
358
|
-
schemaFields.push(currentPath);
|
|
359
|
-
if (allowed && !(allowed === null || allowed === void 0 ? void 0 : allowed[item])) {
|
|
360
|
-
continue;
|
|
361
|
-
}
|
|
362
|
-
usedFields.push(currentPath);
|
|
363
|
-
fieldsString =
|
|
364
|
-
fieldsString +
|
|
365
|
-
this.prepareFields(item, {
|
|
366
|
-
allowed: typeof (allowed === null || allowed === void 0 ? void 0 : allowed[item]) === 'object' && !((allowed === null || allowed === void 0 ? void 0 : allowed[item]) instanceof GraphQLType) ? allowed === null || allowed === void 0 ? void 0 : allowed[item] : item,
|
|
367
|
-
parent: currentPath + '.',
|
|
368
|
-
spaces,
|
|
369
|
-
schemaFields,
|
|
370
|
-
tab: tab + 1,
|
|
371
|
-
usedFields,
|
|
372
|
-
}).fieldsString;
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
// Process object
|
|
376
|
-
else if (typeof fields === 'object') {
|
|
377
|
-
for (const [key, val] of Object.entries(fields)) {
|
|
378
|
-
const currentPath = parent + key;
|
|
379
|
-
schemaFields.push(currentPath);
|
|
380
|
-
if (allowed && !allowed[key]) {
|
|
381
|
-
continue;
|
|
382
|
-
}
|
|
383
|
-
usedFields.push(currentPath);
|
|
384
|
-
if (typeof val !== 'object' || !Object.keys(val).length) {
|
|
385
|
-
fieldsString = fieldsString + '\n' + ' '.repeat(spaces).repeat(tab) + key;
|
|
386
|
-
}
|
|
387
|
-
else {
|
|
388
|
-
fieldsString =
|
|
389
|
-
fieldsString +
|
|
390
|
-
'\n' +
|
|
391
|
-
' '.repeat(spaces).repeat(tab) +
|
|
392
|
-
key +
|
|
393
|
-
' ' +
|
|
394
|
-
'{' +
|
|
395
|
-
this.prepareFields(val, {
|
|
396
|
-
allowed: typeof (allowed === null || allowed === void 0 ? void 0 : allowed[key]) === 'object' && !((allowed === null || allowed === void 0 ? void 0 : allowed[key]) instanceof GraphQLType) ? allowed === null || allowed === void 0 ? void 0 : allowed[key] : key,
|
|
397
|
-
parent: currentPath + '.',
|
|
398
|
-
spaces,
|
|
399
|
-
schemaFields,
|
|
400
|
-
tab: tab + 1,
|
|
401
|
-
usedFields,
|
|
402
|
-
}).fieldsString +
|
|
403
|
-
'\n' +
|
|
404
|
-
' '.repeat(spaces).repeat(tab) +
|
|
405
|
-
'}';
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
// Return result
|
|
410
|
-
return { fieldsString, schemaFields, usedFields };
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
GraphQLService.ɵprov = i0.ɵɵdefineInjectable({ factory: function GraphQLService_Factory() { return new GraphQLService(i0.ɵɵinject(i1.Apollo), i0.ɵɵinject(i2.GraphQLMetaService)); }, token: GraphQLService, providedIn: "root" });
|
|
414
|
-
GraphQLService.decorators = [
|
|
415
|
-
{ type: Injectable, args: [{
|
|
416
|
-
providedIn: 'root',
|
|
417
|
-
},] }
|
|
418
|
-
];
|
|
419
|
-
GraphQLService.ctorParameters = () => [
|
|
420
|
-
{ type: Apollo },
|
|
421
|
-
{ type: GraphQLMetaService }
|
|
422
|
-
];
|
|
423
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9zcmMvbGliL2Jhc2Uvc2VydmljZXMvZ3JhcGhxbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7O0FBRzVEOztHQUVHO0FBSUgsTUFBTSxPQUFPLGNBQWM7SUFDekI7O09BRUc7SUFDSCxZQUFzQixNQUFjLEVBQVksa0JBQXNDO1FBQWhFLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBWSx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO0lBQUcsQ0FBQztJQUUxRjs7T0FFRztJQUNJLE9BQU8sQ0FBQyxPQUFlLEVBQUUsVUFBMkIsRUFBRTtRQUMzRCxrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsYUFBYTtRQUNiLE1BQU0sTUFBTSxtQkFDVixTQUFTLEVBQUUsSUFBSSxFQUNmLE1BQU0sRUFBRSxJQUFJLEVBQ1osR0FBRyxFQUFFLEtBQUssRUFDVixLQUFLLEVBQUUsSUFBSSxFQUNYLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLElB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TTtvQkFDTCxZQUFZO3dCQUNWLFlBQVk7NEJBQ1osSUFBSTs0QkFDSixHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7NEJBQzlCLEdBQUc7NEJBQ0gsR0FBRzs0QkFDSCxHQUFHOzRCQUNILElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFO2dDQUN0QixPQUFPLEVBQ0wsT0FBTyxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRyxHQUFHLENBQUMsQ0FBQSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUcsR0FBRyxDQUFDLGFBQVksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRztnQ0FDdkcsTUFBTSxFQUFFLFdBQVcsR0FBRyxHQUFHO2dDQUN6QixNQUFNO2dDQUNOLFlBQVk7Z0NBQ1osR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO2dDQUNaLFVBQVU7NkJBQ1gsQ0FBQyxDQUFDLFlBQVk7NEJBQ2YsSUFBSTs0QkFDSixHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7NEJBQzlCLEdBQUcsQ0FBQztpQkFDUDthQUNGO1NBQ0Y7UUFFRCxnQkFBZ0I7UUFDaEIsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUM7SUFDcEQsQ0FBQzs7OztZQXpnQkYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7WUFmUSxNQUFNO1lBS04sa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBvbGxvLCBncWwgfSBmcm9tICdhcG9sbG8tYW5ndWxhcic7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJR3JhcGhRTE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2dyYXBocWwtb3B0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgR3JhcGhRTFJlcXVlc3RUeXBlIH0gZnJvbSAnLi4vZW51bXMvZ3JhcGhxbC1yZXF1ZXN0LXR5cGUuZW51bSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBHcmFwaFFMTWV0YVNlcnZpY2UgfSBmcm9tICcuL2dyYXBocWwtbWV0YS5zZXJ2aWNlJztcbmltcG9ydCB7IEdyYXBoUUxFbnVtIH0gZnJvbSAnLi4vY2xhc3Nlcy9ncmFwaHFsLWVudW0uY2xhc3MnO1xuaW1wb3J0IHsgR3JhcGhRTFR5cGUgfSBmcm9tICcuLi9jbGFzc2VzL2dyYXBocWwtdHlwZS5jbGFzcyc7XG5pbXBvcnQgeyBJR3JhcGhRTFR5cGVDb2xsZWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ncmFwaHFsLXR5cGUtY29sbGVjdGlvbi5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEdyYXBoUUwgc2VydmljZVxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgR3JhcGhRTFNlcnZpY2Uge1xuICAvKipcbiAgICogSW5jbHVkZSBzZXJ2aWNlc1xuICAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGFwb2xsbzogQXBvbGxvLCBwcm90ZWN0ZWQgZ3JhcGhRTE1ldGFTZXJ2aWNlOiBHcmFwaFFMTWV0YVNlcnZpY2UpIHt9XG5cbiAgLyoqXG4gICAqIEdyYXBoUUwgcmVxdWVzdFxuICAgKi9cbiAgcHVibGljIGdyYXBoUWwoZ3JhcGhxbDogc3RyaW5nLCBvcHRpb25zOiBJR3JhcGhRTE9wdGlvbnMgPSB7fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgLy8gQ2hlY2sgYXJndW1lbnRzXG4gICAgaWYgKCFncmFwaHFsKSB7XG4gICAgICB0aHJvd0Vycm9yKCdNaXNzaW5nIGdyYXBocWwgYXJndW1lbnQnKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgY29uZmlnXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgYXJndW1lbnRzOiBudWxsLFxuICAgICAgZmllbGRzOiBudWxsLFxuICAgICAgbG9nOiBmYWxzZSxcbiAgICAgIG1vZGVsOiBudWxsLFxuICAgICAgdHlwZTogR3JhcGhRTFJlcXVlc3RUeXBlLlFVRVJZLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgLy8gQ29udmVydCBjbGFzcyB0byBPYmplY3QgZm9yIGFyZ3VtZW50c1xuICAgIGlmICh0eXBlb2YgY29uZmlnLmFyZ3VtZW50cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uZmlnLmFyZ3VtZW50cyA9IG5ldyBjb25maWcuYXJndW1lbnRzKCk7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBjbGFzcyB0byBPYmplY3QgZm9yIGZpZWxkc1xuICAgIGlmICh0eXBlb2YgY29uZmlnLmZpZWxkcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uZmlnLmZpZWxkcyA9IG5ldyBjb25maWcuZmllbGRzKCk7XG4gICAgfVxuXG4gICAgLy8gTG9nXG4gICAgaWYgKGNvbmZpZy5sb2cpIHtcbiAgICAgIGNvbnNvbGUubG9nKHsgY29uZmlnIH0pO1xuICAgIH1cblxuICAgIC8vIFNlbmQgcmVxdWVzdFxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoc3Vic2NyaWJlcikgPT4ge1xuICAgICAgLy8gR2V0IG1ldGFcbiAgICAgIHRoaXMuZ3JhcGhRTE1ldGFTZXJ2aWNlLmdldE1ldGEoeyBsb2c6IGNvbmZpZy5sb2cgfSkuc3Vic2NyaWJlKChtZXRhKSA9PiB7XG4gICAgICAgIC8vIFByZXBhcmUgZmllbGRzXG4gICAgICAgIGxldCBmaWVsZHM7XG4gICAgICAgIGxldCBhbGxvd2VkRmllbGRzO1xuXG4gICAgICAgIC8vIExvZyBtZXRhXG4gICAgICAgIGlmIChjb25maWcubG9nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coeyBtZXRhIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5maWVsZHMpIHtcbiAgICAgICAgICBhbGxvd2VkRmllbGRzID0gbWV0YS5nZXRGaWVsZHMoZ3JhcGhxbCwgeyB0eXBlOiBjb25maWcudHlwZSB9KTtcblxuICAgICAgICAgIC8vIExvZyBtZXRhXG4gICAgICAgICAgaWYgKGNvbmZpZy5sb2cpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHsgYWxsb3dlZEZpZWxkcyB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmaWVsZHNEYXRhID0gdGhpcy5wcmVwYXJlRmllbGRzKGNvbmZpZy5maWVsZHMsIHtcbiAgICAgICAgICAgIGFsbG93ZWQ6IGFsbG93ZWRGaWVsZHMsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBMb2cgZmllbGRzIGRhdGFcbiAgICAgICAgICBpZiAoY29uZmlnLmxvZykge1xuICAgICAgICAgICAgZmllbGRzRGF0YS51c2VkRmllbGRzLnNvcnQoKTtcbiAgICAgICAgICAgIGZpZWxkc0RhdGEuc2NoZW1hRmllbGRzLnNvcnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkID0gZmllbGRzRGF0YS5zY2hlbWFGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT4gIWZpZWxkc0RhdGEudXNlZEZpZWxkcy5pbmNsdWRlcyhmaWVsZCkpO1xuICAgICAgICAgICAgY29uc3QgdW51c2VkID0gdGhpcy5ncmFwaFFMVHlwZUNvbGxlY3Rpb25Ub1N0cmluZ0FycmF5KGFsbG93ZWRGaWVsZHMpLmZpbHRlcihcbiAgICAgICAgICAgICAgKGZpZWxkKSA9PiAhZmllbGRzRGF0YS51c2VkRmllbGRzLmluY2x1ZGVzKGZpZWxkKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHsgZmllbGRzRGF0YSwgZmlsdGVyZWQsIHVudXNlZCB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWVsZHMgPSBmaWVsZHNEYXRhLmZpZWxkc1N0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZHMgJiYgIWZpZWxkcy5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgICAgICBmaWVsZHMgPSAneycgKyBmaWVsZHMgKyAnXFxufSc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2cgZmllbGRzXG4gICAgICAgIGlmIChjb25maWcubG9nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coeyBmaWVsZHMgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgYWxsb3dlZCBhcmdzXG4gICAgICAgIGNvbnN0IGFsbG93ZWRBcmdzID0gbWV0YS5nZXRBcmdzKGdyYXBocWwsIHsgdHlwZTogY29uZmlnLnR5cGUgfSk7XG5cbiAgICAgICAgLy8gTG9nIGFsbG93ZWQgYXJnc1xuICAgICAgICBpZiAoY29uZmlnLmxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHsgYWxsb3dlZEFyZ3MgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmdzRGF0YSA9IHRoaXMucHJlcGFyZUFyZ3VtZW50cyhjb25maWcuYXJndW1lbnRzLCB7XG4gICAgICAgICAgYWxsb3dlZDogYWxsb3dlZEFyZ3MsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIExvZyBhcmdzIGRhdGFcbiAgICAgICAgaWYgKGNvbmZpZy5sb2cpIHtcbiAgICAgICAgICBhcmdzRGF0YS51c2VkQXJncy5zb3J0KCk7XG4gICAgICAgICAgYXJnc0RhdGEuc2NoZW1hQXJncy5zb3J0KCk7XG4gICAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBhcmdzRGF0YS5zY2hlbWFBcmdzLmZpbHRlcigoZmllbGQpID0+ICFhcmdzRGF0YS51c2VkQXJncy5pbmNsdWRlcyhmaWVsZCkpO1xuICAgICAgICAgIGNvbnN0IHVudXNlZCA9IHRoaXMuZ3JhcGhRTFR5cGVDb2xsZWN0aW9uVG9TdHJpbmdBcnJheShhbGxvd2VkQXJncylcbiAgICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAgIC5maWx0ZXIoKGZpZWxkKSA9PiAhYXJnc0RhdGEudXNlZEFyZ3MuaW5jbHVkZXMoZmllbGQpKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyh7IGFyZ3NEYXRhLCBmaWx0ZXJlZCwgdW51c2VkIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJncyA9IGFyZ3NEYXRhPy5hcmdzU3RyaW5nIHx8ICcnO1xuXG4gICAgICAgIC8vIExvZ1xuICAgICAgICBpZiAoY29uZmlnLmxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHsgZ3JhcGhRTDogZ3JhcGhxbCwgYXJncywgZmllbGRzLCB0eXBlOiBjb25maWcudHlwZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByZXBhcmUgcmVxdWVzdFxuICAgICAgICBjb25zdCBkb2N1bWVudE5vZGUgPSBmaWVsZHNcbiAgICAgICAgICA/IGdxbChjb25maWcudHlwZSArICd7XFxuJyArIGdyYXBocWwgKyBhcmdzICsgZmllbGRzICsgJ1xcbn0nKVxuICAgICAgICAgIDogZ3FsKGNvbmZpZy50eXBlICsgJ3tcXG4nICsgZ3JhcGhxbCArIGFyZ3MgKyAnXFxufScpO1xuXG4gICAgICAgIC8vIExvZ1xuICAgICAgICBpZiAoY29uZmlnLmxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHsgZG9jdW1lbnROb2RlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdDogYW55ID0ge307XG4gICAgICAgIHJlcXVlc3RbY29uZmlnLnR5cGVdID0gZG9jdW1lbnROb2RlO1xuXG4gICAgICAgIC8vIExvZ1xuICAgICAgICBpZiAoY29uZmlnLmxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHsgcmVxdWVzdCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmdW5jO1xuICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IEdyYXBoUUxSZXF1ZXN0VHlwZS5NVVRBVElPTikge1xuICAgICAgICAgIGZ1bmMgPSAnbXV0YXRlJztcbiAgICAgICAgICByZXF1ZXN0W2NvbmZpZy50eXBlXSA9IGRvY3VtZW50Tm9kZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gR3JhcGhRTFJlcXVlc3RUeXBlLlNVQlNDUklQVElPTikge1xuICAgICAgICAgIGZ1bmMgPSAnc3Vic2NyaWJlJztcbiAgICAgICAgICByZXF1ZXN0LnF1ZXJ5ID0gZG9jdW1lbnROb2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZ1bmMgPSBjb25maWcudHlwZTtcbiAgICAgICAgICByZXF1ZXN0W2NvbmZpZy50eXBlXSA9IGRvY3VtZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgICh0aGlzLmFwb2xsbyBhcyBhbnkpW2Z1bmNdKHJlcXVlc3QpLnN1YnNjcmliZShcbiAgICAgICAgICAocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSByZXN1bHQ/LmRhdGE/LltncmFwaHFsXSAhPT0gdW5kZWZpbmVkID8gcmVzdWx0LmRhdGFbZ3JhcGhxbF0gOiByZXN1bHQ7XG5cbiAgICAgICAgICAgIC8vIERpcmVjdCBkYXRhXG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5tb2RlbCkge1xuICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE1hcCBkYXRhIGFzIGFycmF5XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChcbiAgICAgICAgICAgICAgICBkYXRhLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZy5tb2RlbC5tYXAoaXRlbSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTWFwIGRhdGFcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoY29uZmlnLm1vZGVsLm1hcChkYXRhKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb25maWcudHlwZSAhPT0gR3JhcGhRTFJlcXVlc3RUeXBlLlNVQlNDUklQVElPTikge1xuICAgICAgICAgICAgICAvLyBEb25lXG4gICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZmllbGRzIC8gYXJncyBmcm9tIElHcmFwaFFMVHlwZUNvbGxlY3Rpb25cbiAgICovXG4gIHByb3RlY3RlZCBncmFwaFFMVHlwZUNvbGxlY3Rpb25Ub1N0cmluZ0FycmF5KFxuICAgIGNvbGxlY3Rpb246IElHcmFwaFFMVHlwZUNvbGxlY3Rpb24sXG4gICAgY3VycmVudCA9ICcnLFxuICAgIHJlc3VsdCA9IFtdLFxuICAgIGNhY2hlTm9kZSA9IFtdXG4gICkge1xuICAgIGlmIChjb2xsZWN0aW9uKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIEdyYXBoUUxUeXBlKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGN1cnJlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJlbnQ/LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICBjYWNoZU5vZGUucHVzaChjdXJyZW50LnNwbGl0KCcuJylbMV0pO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICBjYWNoZU5vZGUucHVzaChjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIGlmIChjdXJyZW50ID09PSBrZXkgfHwgY2FjaGVOb2RlLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmdyYXBoUUxUeXBlQ29sbGVjdGlvblRvU3RyaW5nQXJyYXkoXG4gICAgICAgICAgICBjb2xsZWN0aW9uW2tleV0gYXMgSUdyYXBoUUxUeXBlQ29sbGVjdGlvbixcbiAgICAgICAgICAgIGN1cnJlbnQgPyBjdXJyZW50ICsgJy4nICsga2V5IDoga2V5LFxuICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgY2FjaGVOb2RlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgYXJndW1lbnRzIGZvciBHcmFwaFFMIHJlcXVlc3RcbiAgICovXG4gIHByb3RlY3RlZCBwcmVwYXJlQXJndW1lbnRzKFxuICAgIGFyZ3M6IGFueSxcbiAgICBvcHRpb25zOiB7XG4gICAgICBhbGxvd2VkPzogYW55O1xuICAgICAgbGV2ZWw/OiBudW1iZXI7XG4gICAgICBwYXJlbnQ/OiBzdHJpbmc7XG4gICAgICBzY2hlbWFBcmdzPzogc3RyaW5nW107XG4gICAgICB1c2VkQXJncz86IHN0cmluZ1tdO1xuICAgIH0gPSB7fVxuICApOiB7IGFyZ3NTdHJpbmc6IHN0cmluZzsgc2NoZW1hQXJnczogc3RyaW5nW107IHVzZWRBcmdzOiBzdHJpbmdbXSB9IHtcbiAgICAvLyBJbml0IGNvbmZpZyB2YXJpYWJsZXNcbiAgICBjb25zdCB7IGFsbG93ZWQsIGxldmVsLCBwYXJlbnQsIHNjaGVtYUFyZ3MsIHVzZWRBcmdzIH0gPSB7XG4gICAgICBhbGxvd2VkOiBudWxsLFxuICAgICAgbGV2ZWw6IDEsXG4gICAgICBwYXJlbnQ6ICcnLFxuICAgICAgc2NoZW1hQXJnczogW10sXG4gICAgICB1c2VkQXJnczogW10sXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICAvLyBDaGVjayBhcmdzXG4gICAgaWYgKGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzID09PSBudWxsKSB7XG4gICAgICByZXR1cm4geyBhcmdzU3RyaW5nOiAnJywgc2NoZW1hQXJncywgdXNlZEFyZ3MgfTtcbiAgICB9XG5cbiAgICAvLyBJbml0IGFyZ3NcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIC8vIFByb2Nlc3MgYXJyYXlcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSkge1xuICAgICAgY29uc3QgYWxsb3dlZEtleXMgPSBhbGxvd2VkID8gT2JqZWN0LmtleXMoYWxsb3dlZCkgOiBudWxsO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFyZ3MpIHtcbiAgICAgICAgbGV0IGtleSA9IG51bGw7XG4gICAgICAgIGlmIChhbGxvd2VkKSB7XG4gICAgICAgICAgaWYgKGFsbG93ZWQubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGtleSA9IGFsbG93ZWRLZXlzPy5zaGlmdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJvY2VzcyB2YWx1ZVxuICAgICAgICByZXN1bHQucHVzaChcbiAgICAgICAgICB0aGlzLnByZXBhcmVBcmd1bWVudHMoaXRlbSwge1xuICAgICAgICAgICAgYWxsb3dlZDoga2V5ID8gYWxsb3dlZFtrZXldIDogbnVsbCxcbiAgICAgICAgICAgIGxldmVsOiBsZXZlbCArIDEsXG4gICAgICAgICAgICBwYXJlbnQ6IHBhcmVudCArIGtleSArICcuJyxcbiAgICAgICAgICAgIHNjaGVtYUFyZ3MsXG4gICAgICAgICAgICB1c2VkQXJncyxcbiAgICAgICAgICB9KS5hcmdzU3RyaW5nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVuY2Fwc3VsYXRpb24gb2YgdGhlIGFycmF5IHJlc3VsdFxuICAgICAgaWYgKHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgLy8gQ29tcGxldGUgcmVzdWx0LCBlbmNhcHN1bGF0ZWQgdmlhIHJvdW5kIGJyYWNrZXRzXG4gICAgICAgIGlmIChsZXZlbCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiB7IGFyZ3NTdHJpbmc6ICcoJyArIHJlc3VsdC5qb2luKCcsICcpICsgJyknLCBzY2hlbWFBcmdzLCB1c2VkQXJncyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVlcGVyIHJlc3VsdCBwYXJ0LCBlbmNhcHN1bGF0ZWQgdmlhIHNxdWFyZSBicmFja2V0c1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4geyBhcmdzU3RyaW5nOiAnWycgKyByZXN1bHQuam9pbignLCAnKSArICddJywgc2NoZW1hQXJncywgdXNlZEFyZ3MgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByb2Nlc3Mgb2JqZWN0XG4gICAgZWxzZSBpZiAodHlwZW9mIGFyZ3MgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBDaGVjayBvYmplY3QgaXMgZW1wdHlcbiAgICAgIGlmIChhcmdzICYmIE9iamVjdC5rZXlzKGFyZ3MpLmxlbmd0aCA9PT0gMCAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYXJncykgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcmV0dXJuIHsgYXJnc1N0cmluZzogJ3t9Jywgc2NoZW1hQXJncywgdXNlZEFyZ3MgfTtcbiAgICAgIH1cbiAgICAgIC8vIFByb2Nlc3MgYWxsIG9iamVjdCBlbnRyaWVzXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcmdzKSkge1xuICAgICAgICAvLyBJbml0IGRhdGEgZm9yIGN1cnJlbnQgZW50cnlcbiAgICAgICAgY29uc3QgY3VycmVudEtleSA9IHBhcmVudCArIGtleTtcbiAgICAgICAgc2NoZW1hQXJncy5wdXNoKGN1cnJlbnRLZXkpO1xuXG4gICAgICAgIC8vIElmIHRoZSBhbGxvd2VkIGtleSBoYW5kbGluZyBpcyBlbmFibGVkIGFuZCB0aGUgY3VycmVudCBrZXkgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIGFsbG93ZWQga2V5cyxcbiAgICAgICAgLy8gdGhlIGN1cnJlbnQga2V5IHdpbGwgYmUgc2tpcHBlZFxuICAgICAgICBpZiAoYWxsb3dlZCAmJiAhYWxsb3dlZFtrZXldKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTa2lwIHZhbHVlIGlmIG5vdCBleGlzdHNcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBjdXJyZW50IGtleSB0byBtZXRhZGF0YVxuICAgICAgICB1c2VkQXJncy5wdXNoKGN1cnJlbnRLZXkpO1xuXG4gICAgICAgIC8vIFByb2Nlc3MgR3JhcGhRTEVudW1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgR3JhcGhRTEVudW0pIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkgKyAnOicgKyB2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9jZXNzIGFycmF5XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgICBrZXkgK1xuICAgICAgICAgICAgICAnOiBbJyArXG4gICAgICAgICAgICAgIHZhbHVlLm1hcChcbiAgICAgICAgICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICAgIHRoaXMucHJlcGFyZUFyZ3VtZW50cyhpdGVtLCB7XG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWQ6IGFsbG93ZWRba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGxldmVsICsgMSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdXJyZW50S2V5ICsgJy4nLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWFBcmdzLFxuICAgICAgICAgICAgICAgICAgICB1c2VkQXJncyxcbiAgICAgICAgICAgICAgICAgIH0pLmFyZ3NTdHJpbmdcbiAgICAgICAgICAgICAgKSArXG4gICAgICAgICAgICAgICddJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmVwYXJlIGFkZGl0aW9uYWwgcmVzdWx0IHN0cmluZ1xuICAgICAgICBsZXQgYWRkaXRpb25hbFJlc3VsdCA9IGtleSArICc6ICc7XG5cbiAgICAgICAgLy8gVmFsdWUgaXMgYSBkYXRlIG9iamVjdFxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICAgICAgICBhZGRpdGlvbmFsUmVzdWx0ICs9IGBcIlwiXCIkeyh2YWx1ZSBhcyBEYXRlKS50b1N0cmluZygpfVwiXCJcImA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWx1ZSBpcyBhIHN0cmluZ1xuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgLy8gRW51bSAoZG9lc24ndCBuZWVkIHF1b3RhdGlvbiBtYXJrcylcbiAgICAgICAgICBpZiAoYWxsb3dlZFtrZXldLmlzRW51bSkge1xuICAgICAgICAgICAgYWRkaXRpb25hbFJlc3VsdCArPSB2YWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdHJpbmdcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxSZXN1bHQgKz0gYFwiXCJcIiR7dmFsdWUucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpfVwiXCJcImA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsdWUgaXMgYSBzaW1wbGUgYm9vbGVhbiBvciBhIG51bWJlclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgYWRkaXRpb25hbFJlc3VsdCArPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE90aGVyc1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBhZGRpdGlvbmFsUmVzdWx0ICs9IHRoaXMucHJlcGFyZUFyZ3VtZW50cyh2YWx1ZSwge1xuICAgICAgICAgICAgYWxsb3dlZDogYWxsb3dlZFtrZXldLFxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsICsgMSxcbiAgICAgICAgICAgIHBhcmVudDogY3VycmVudEtleSArICcuJyxcbiAgICAgICAgICAgIHNjaGVtYUFyZ3MsXG4gICAgICAgICAgICB1c2VkQXJncyxcbiAgICAgICAgICB9KS5hcmdzU3RyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHVzaCBkZWVwZXIgcGFydCBpbnRvIHJlc3VsdCBhcnJheVxuICAgICAgICByZXN1bHQucHVzaChhZGRpdGlvbmFsUmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgLy8gRW5jYXBzdWxhdGlvbiBvZiB0aGUgb2JqZWN0IHJlc3VsdFxuICAgICAgaWYgKHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgLy8gQ29tcGxldGUgcmVzdWx0LCBlbmNhcHN1bGF0ZWQgdmlhIHJvdW5kIGJyYWNrZXRzXG4gICAgICAgIGlmIChsZXZlbCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiB7IGFyZ3NTdHJpbmc6ICcoJyArIHJlc3VsdC5qb2luKCcsICcpICsgJyknLCBzY2hlbWFBcmdzLCB1c2VkQXJncyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVlcGVyIHJlc3VsdCBwYXJ0LCBlbmNhcHN1bGF0ZWQgdmlhIGN1cmx5IGJyYWNrZXRzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7IGFyZ3NTdHJpbmc6ICd7JyArIHJlc3VsdC5qb2luKCcsICcpICsgJ30nLCBzY2hlbWFBcmdzLCB1c2VkQXJncyB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSBhbmQgcHJvY2VzcyBvdGhlciAvIHVua25vd24gdmFsdWVzIGFzIEpTT05cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiB7IGFyZ3NTdHJpbmc6IEpTT04uc3RyaW5naWZ5KGFyZ3MpLCBzY2hlbWFBcmdzLCB1c2VkQXJncyB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlIGZpZWxkcyBmb3IgR3JhcGhRTCByZXF1ZXN0XG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlcGFyZUZpZWxkcyhcbiAgICBmaWVsZHM6IGFueSxcbiAgICBvcHRpb25zOiB7XG4gICAgICBhbGxvd2VkPzogYW55O1xuICAgICAgc2NoZW1hRmllbGRzPzogc3RyaW5nW107XG4gICAgICB1c2VkRmllbGRzPzogc3RyaW5nW107XG4gICAgICBwYXJlbnQ/OiBzdHJpbmc7XG4gICAgICBzcGFjZXM/OiBudW1iZXI7XG4gICAgICB0YWI/OiBudW1iZXI7XG4gICAgfSA9IHt9XG4gICk6IHsgc2NoZW1hRmllbGRzOiBzdHJpbmdbXTsgZmllbGRzU3RyaW5nOiBzdHJpbmc7IHVzZWRGaWVsZHM6IHN0cmluZ1tdIH0ge1xuICAgIC8vIENvbmZpZ1xuICAgIGNvbnN0IHsgYWxsb3dlZCwgcGFyZW50LCBzY2hlbWFGaWVsZHMsIHNwYWNlcywgdGFiLCB1c2VkRmllbGRzIH0gPSB7XG4gICAgICBhbGxvd2VkOiBudWxsLFxuICAgICAgcGFyZW50OiAnJyxcbiAgICAgIHNjaGVtYUZpZWxkczogW10sXG4gICAgICBzcGFjZXM6IDIsXG4gICAgICB0YWI6IDEsXG4gICAgICB1c2VkRmllbGRzOiBbXSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIC8vIEluaXQgZmllbGRzIHN0cmluZ1xuICAgIGxldCBmaWVsZHNTdHJpbmcgPSAnJztcblxuICAgIC8vIENoZWNrIGZpZWxkc1xuICAgIGlmICghZmllbGRzKSB7XG4gICAgICByZXR1cm4geyBmaWVsZHNTdHJpbmcsIHNjaGVtYUZpZWxkcywgdXNlZEZpZWxkcyB9O1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3Mgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBmaWVsZHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGFsbG93ZWQgJiZcbiAgICAgICAgKCh0eXBlb2YgYWxsb3dlZCA9PT0gJ3N0cmluZycgJiYgYWxsb3dlZCAhPT0gZmllbGRzKSB8fCAodHlwZW9mIGFsbG93ZWQgPT09ICdvYmplY3QnICYmICFhbGxvd2VkW2ZpZWxkc10pKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB7IGZpZWxkc1N0cmluZywgc2NoZW1hRmllbGRzLCB1c2VkRmllbGRzIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBmaWVsZHNTdHJpbmc6ICdcXG4nICsgJyAnLnJlcGVhdChzcGFjZXMpLnJlcGVhdCh0YWIpICsgZmllbGRzLCBzY2hlbWFGaWVsZHMsIHVzZWRGaWVsZHMgfTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGFycmF5XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWVsZHMpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZmllbGRzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBmaWVsZHNTdHJpbmcgPVxuICAgICAgICAgICAgZmllbGRzU3RyaW5nICtcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUZpZWxkcyhpdGVtLCB7XG4gICAgICAgICAgICAgIGFsbG93ZWQsXG4gICAgICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICAgICAgc3BhY2VzLFxuICAgICAgICAgICAgICBzY2hlbWFGaWVsZHMsXG4gICAgICAgICAgICAgIHRhYjogdGFiICsgMSxcbiAgICAgICAgICAgICAgdXNlZEZpZWxkcyxcbiAgICAgICAgICAgIH0pLmZpZWxkc1N0cmluZztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IHBhcmVudCArIGl0ZW07XG4gICAgICAgIHNjaGVtYUZpZWxkcy5wdXNoKGN1cnJlbnRQYXRoKTtcbiAgICAgICAgaWYgKGFsbG93ZWQgJiYgIWFsbG93ZWQ/LltpdGVtXSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHVzZWRGaWVsZHMucHVzaChjdXJyZW50UGF0aCk7XG4gICAgICAgIGZpZWxkc1N0cmluZyA9XG4gICAgICAgICAgZmllbGRzU3RyaW5nICtcbiAgICAgICAgICB0aGlzLnByZXBhcmVGaWVsZHMoaXRlbSwge1xuICAgICAgICAgICAgYWxsb3dlZDpcbiAgICAgICAgICAgICAgdHlwZW9mIGFsbG93ZWQ/LltpdGVtXSA9PT0gJ29iamVjdCcgJiYgIShhbGxvd2VkPy5baXRlbV0gaW5zdGFuY2VvZiBHcmFwaFFMVHlwZSkgPyBhbGxvd2VkPy5baXRlbV0gOiBpdGVtLFxuICAgICAgICAgICAgcGFyZW50OiBjdXJyZW50UGF0aCArICcuJyxcbiAgICAgICAgICAgIHNwYWNlcyxcbiAgICAgICAgICAgIHNjaGVtYUZpZWxkcyxcbiAgICAgICAgICAgIHRhYjogdGFiICsgMSxcbiAgICAgICAgICAgIHVzZWRGaWVsZHMsXG4gICAgICAgICAgfSkuZmllbGRzU3RyaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByb2Nlc3Mgb2JqZWN0XG4gICAgZWxzZSBpZiAodHlwZW9mIGZpZWxkcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhmaWVsZHMpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gcGFyZW50ICsga2V5O1xuICAgICAgICBzY2hlbWFGaWVsZHMucHVzaChjdXJyZW50UGF0aCk7XG4gICAgICAgIGlmIChhbGxvd2VkICYmICFhbGxvd2VkW2tleV0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB1c2VkRmllbGRzLnB1c2goY3VycmVudFBhdGgpO1xuICAgICAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgfHwgIU9iamVjdC5rZXlzKHZhbCkubGVuZ3RoKSB7XG4gICAgICAgICAgZmllbGRzU3RyaW5nID0gZmllbGRzU3RyaW5nICsgJ1xcbicgKyAnICcucmVwZWF0KHNwYWNlcykucmVwZWF0KHRhYikgKyBrZXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGRzU3RyaW5nID1cbiAgICAgICAgICAgIGZpZWxkc1N0cmluZyArXG4gICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAnICcucmVwZWF0KHNwYWNlcykucmVwZWF0KHRhYikgK1xuICAgICAgICAgICAga2V5ICtcbiAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAneycgK1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlRmllbGRzKHZhbCwge1xuICAgICAgICAgICAgICBhbGxvd2VkOlxuICAgICAgICAgICAgICAgIHR5cGVvZiBhbGxvd2VkPy5ba2V5XSA9PT0gJ29iamVjdCcgJiYgIShhbGxvd2VkPy5ba2V5XSBpbnN0YW5jZW9mIEdyYXBoUUxUeXBlKSA/IGFsbG93ZWQ/LltrZXldIDoga2V5LFxuICAgICAgICAgICAgICBwYXJlbnQ6IGN1cnJlbnRQYXRoICsgJy4nLFxuICAgICAgICAgICAgICBzcGFjZXMsXG4gICAgICAgICAgICAgIHNjaGVtYUZpZWxkcyxcbiAgICAgICAgICAgICAgdGFiOiB0YWIgKyAxLFxuICAgICAgICAgICAgICB1c2VkRmllbGRzLFxuICAgICAgICAgICAgfSkuZmllbGRzU3RyaW5nICtcbiAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICcgJy5yZXBlYXQoc3BhY2VzKS5yZXBlYXQodGFiKSArXG4gICAgICAgICAgICAnfSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gcmVzdWx0XG4gICAgcmV0dXJuIHsgZmllbGRzU3RyaW5nLCBzY2hlbWFGaWVsZHMsIHVzZWRGaWVsZHMgfTtcbiAgfVxufVxuIl19
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { Helper } from '../classes/helper.class';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
/**
|
|
6
|
-
* Image service
|
|
7
|
-
*/
|
|
8
|
-
export class ImageService {
|
|
9
|
-
/**
|
|
10
|
-
* Preaload images (for lazy handling)
|
|
11
|
-
*
|
|
12
|
-
* @param options
|
|
13
|
-
* @protected
|
|
14
|
-
*/
|
|
15
|
-
preLoadImages(options) {
|
|
16
|
-
// Init configuration
|
|
17
|
-
const config = Object.assign({ doneFunnction: undefined, elements: document, regExp: undefined }, options);
|
|
18
|
-
return new Promise((resolve) => {
|
|
19
|
-
var _a;
|
|
20
|
-
// Convert element(s) into array
|
|
21
|
-
if (!Array.isArray(config.elements)) {
|
|
22
|
-
// NodeList or HTMLCollection
|
|
23
|
-
if (Helper.isNodeList(config.elements)) {
|
|
24
|
-
config.elements = Array.from(config.elements);
|
|
25
|
-
}
|
|
26
|
-
// Single element
|
|
27
|
-
else {
|
|
28
|
-
config.elements = [config.elements];
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
// Init loading
|
|
32
|
-
const promises = [];
|
|
33
|
-
// Get all images
|
|
34
|
-
let images = [];
|
|
35
|
-
config.elements.forEach((element) => {
|
|
36
|
-
images = images.concat(Array.from(element.getElementsByTagName('img')));
|
|
37
|
-
});
|
|
38
|
-
// Prepare images
|
|
39
|
-
for (let image of images) {
|
|
40
|
-
const src = image.getAttribute('src');
|
|
41
|
-
// Check if changes are necessary and possible
|
|
42
|
-
if ((image.complete && image.naturalHeight !== 0) || // already laoded
|
|
43
|
-
!src || // Image has no src
|
|
44
|
-
((_a = config.regExp) === null || _a === void 0 ? void 0 : _a.test(src)) // Test if src matches regular expression
|
|
45
|
-
) {
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
// Replace lazy loading image with immediately loading image
|
|
49
|
-
if (image.getAttribute('loading') === 'lazy') {
|
|
50
|
-
const newImage = document.createElement('img');
|
|
51
|
-
Array.from(image.attributes).forEach((attr) => {
|
|
52
|
-
if (attr.name !== 'loading' && attr.name !== 'src') {
|
|
53
|
-
newImage.setAttribute(attr.name, attr.value);
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
image.replaceWith(newImage);
|
|
57
|
-
image = newImage;
|
|
58
|
-
}
|
|
59
|
-
// Wait for laoding
|
|
60
|
-
promises.push(this.loadImage(image, src));
|
|
61
|
-
}
|
|
62
|
-
// Wait until all images loaded
|
|
63
|
-
Promise.all(promises)
|
|
64
|
-
.catch((e) => console.error('Error during image loading', e))
|
|
65
|
-
.finally(() => __awaiter(this, void 0, void 0, function* () {
|
|
66
|
-
// Return result
|
|
67
|
-
let result;
|
|
68
|
-
if (config.doneFunnction) {
|
|
69
|
-
result = yield config.doneFunction();
|
|
70
|
-
}
|
|
71
|
-
resolve(result);
|
|
72
|
-
}));
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Load image for image element
|
|
77
|
-
*
|
|
78
|
-
* @param imageElement
|
|
79
|
-
* @param src
|
|
80
|
-
* @protected
|
|
81
|
-
*/
|
|
82
|
-
loadImage(imageElement, src) {
|
|
83
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
84
|
-
src = src || imageElement.src;
|
|
85
|
-
return new Promise((resolve, reject) => {
|
|
86
|
-
imageElement.onload = () => resolve(imageElement);
|
|
87
|
-
imageElement.onerror = reject;
|
|
88
|
-
imageElement.src = src;
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
ImageService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ImageService_Factory() { return new ImageService(); }, token: ImageService, providedIn: "root" });
|
|
94
|
-
ImageService.decorators = [
|
|
95
|
-
{ type: Injectable, args: [{
|
|
96
|
-
providedIn: 'root',
|
|
97
|
-
},] }
|
|
98
|
-
];
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2Uvc3JjL2xpYi9iYXNlL3NlcnZpY2VzL2ltYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFDOztBQUVqRDs7R0FFRztBQUlILE1BQU0sT0FBTyxZQUFZO0lBQ3ZCOzs7OztPQUtHO0lBQ0ksYUFBYSxDQUFDLE9BWXBCO1FBQ0MscUJBQXFCO1FBQ3JCLE1BQU0sTUFBTSxtQkFDVixhQUFhLEVBQUUsU0FBUyxFQUN4QixRQUFRLEVBQUUsUUFBUSxFQUNsQixNQUFNLEVBQUUsU0FBUyxJQUNkLE9BQU8sQ0FDWCxDQUFDO1FBRUYsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFOztZQUM3QixnQ0FBZ0M7WUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUNuQyw2QkFBNkI7Z0JBQzdCLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQ3RDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBcUMsQ0FBYyxDQUFDO2lCQUN6RjtnQkFFRCxpQkFBaUI7cUJBQ1o7b0JBQ0gsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQWMsQ0FBQztpQkFDbEQ7YUFDRjtZQUVELGVBQWU7WUFDZixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFFcEIsaUJBQWlCO1lBQ2pCLElBQUksTUFBTSxHQUF1QixFQUFFLENBQUM7WUFDcEMsTUFBTSxDQUFDLFFBQVEsQ0FB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IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSGVscGVyIH0gZnJvbSAnLi4vY2xhc3Nlcy9oZWxwZXIuY2xhc3MnO1xuXG4vKipcbiAqIEltYWdlIHNlcnZpY2VcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEltYWdlU2VydmljZSB7XG4gIC8qKlxuICAgKiBQcmVhbG9hZCBpbWFnZXMgKGZvciBsYXp5IGhhbmRsaW5nKVxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwdWJsaWMgcHJlTG9hZEltYWdlcyhvcHRpb25zPzoge1xuICAgIGRvbmVGdW5jdGlvbj86ICgpID0+IFByb21pc2U8YW55PiB8IGFueSB8IHZvaWQ7XG4gICAgZWxlbWVudHM/OlxuICAgICAgfCBFbGVtZW50XG4gICAgICB8IEVsZW1lbnRbXVxuICAgICAgfCBIVE1MQ29sbGVjdGlvbk9mPEVsZW1lbnQ+XG4gICAgICB8IE5vZGVcbiAgICAgIHwgTm9kZUxpc3RcbiAgICAgIHwgRG9jdW1lbnRcbiAgICAgIHwgSFRNTEVsZW1lbnRcbiAgICAgIHwgSFRNTEVsZW1lbnRbXTtcbiAgICByZWdFeHA/OiBSZWdFeHA7XG4gIH0pOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIEluaXQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGRvbmVGdW5uY3Rpb246IHVuZGVmaW5lZCxcbiAgICAgIGVsZW1lbnRzOiBkb2N1bWVudCxcbiAgICAgIHJlZ0V4cDogdW5kZWZpbmVkLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAvLyBDb252ZXJ0IGVsZW1lbnQocykgaW50byBhcnJheVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZy5lbGVtZW50cykpIHtcbiAgICAgICAgLy8gTm9kZUxpc3Qgb3IgSFRNTENvbGxlY3Rpb25cbiAgICAgICAgaWYgKEhlbHBlci5pc05vZGVMaXN0KGNvbmZpZy5lbGVtZW50cykpIHtcbiAgICAgICAgICBjb25maWcuZWxlbWVudHMgPSBBcnJheS5mcm9tKGNvbmZpZy5lbGVtZW50cyBhcyBIVE1MQ29sbGVjdGlvbiB8IE5vZGVMaXN0KSBhcyBFbGVtZW50W107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaW5nbGUgZWxlbWVudFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb25maWcuZWxlbWVudHMgPSBbY29uZmlnLmVsZW1lbnRzXSBhcyBFbGVtZW50W107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSW5pdCBsb2FkaW5nXG4gICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuXG4gICAgICAvLyBHZXQgYWxsIGltYWdlc1xuICAgICAgbGV0IGltYWdlczogSFRNTEltYWdlRWxlbWVudFtdID0gW107XG4gICAgICBjb25maWcuZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBpbWFnZXMgPSBpbWFnZXMuY29uY2F0KEFycmF5LmZyb20oZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJykpKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcmVwYXJlIGltYWdlc1xuICAgICAgZm9yIChsZXQgaW1hZ2Ugb2YgaW1hZ2VzKSB7XG4gICAgICAgIGNvbnN0IHNyYyA9IGltYWdlLmdldEF0dHJpYnV0ZSgnc3JjJyk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgY2hhbmdlcyBhcmUgbmVjZXNzYXJ5IGFuZCBwb3NzaWJsZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGltYWdlLmNvbXBsZXRlICYmIGltYWdlLm5hdHVyYWxIZWlnaHQgIT09IDApIHx8IC8vIGFscmVhZHkgbGFvZGVkXG4gICAgICAgICAgIXNyYyB8fCAvLyBJbWFnZSBoYXMgbm8gc3JjXG4gICAgICAgICAgY29uZmlnLnJlZ0V4cD8udGVzdChzcmMpIC8vIFRlc3QgaWYgc3JjIG1hdGNoZXMgcmVndWxhciBleHByZXNzaW9uXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVwbGFjZSBsYXp5IGxvYWRpbmcgaW1hZ2Ugd2l0aCBpbW1lZGlhdGVseSBsb2FkaW5nIGltYWdlXG4gICAgICAgIGlmIChpbWFnZS5nZXRBdHRyaWJ1dGUoJ2xvYWRpbmcnKSA9PT0gJ2xhenknKSB7XG4gICAgICAgICAgY29uc3QgbmV3SW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgICAgICBBcnJheS5mcm9tKGltYWdlLmF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICAgIGlmIChhdHRyLm5hbWUgIT09ICdsb2FkaW5nJyAmJiBhdHRyLm5hbWUgIT09ICdzcmMnKSB7XG4gICAgICAgICAgICAgIG5ld0ltYWdlLnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGltYWdlLnJlcGxhY2VXaXRoKG5ld0ltYWdlKTtcbiAgICAgICAgICBpbWFnZSA9IG5ld0ltYWdlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgbGFvZGluZ1xuICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMubG9hZEltYWdlKGltYWdlLCBzcmMpKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2FpdCB1bnRpbCBhbGwgaW1hZ2VzIGxvYWRlZFxuICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4gY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGltYWdlIGxvYWRpbmcnLCBlKSlcbiAgICAgICAgLmZpbmFsbHkoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIC8vIFJldHVybiByZXN1bHRcbiAgICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICAgIGlmIChjb25maWcuZG9uZUZ1bm5jdGlvbikge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgY29uZmlnLmRvbmVGdW5jdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgaW1hZ2UgZm9yIGltYWdlIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIGltYWdlRWxlbWVudFxuICAgKiBAcGFyYW0gc3JjXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkSW1hZ2UoaW1hZ2VFbGVtZW50OiBIVE1MSW1hZ2VFbGVtZW50LCBzcmM/OiBzdHJpbmcpIHtcbiAgICBzcmMgPSBzcmMgfHwgaW1hZ2VFbGVtZW50LnNyYztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaW1hZ2VFbGVtZW50Lm9ubG9hZCA9ICgpID0+IHJlc29sdmUoaW1hZ2VFbGVtZW50KTtcbiAgICAgIGltYWdlRWxlbWVudC5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgaW1hZ2VFbGVtZW50LnNyYyA9IHNyYztcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject } from 'rxjs';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
/**
|
|
5
|
-
* Loader service for loading indication
|
|
6
|
-
*/
|
|
7
|
-
export class LoaderService {
|
|
8
|
-
constructor() {
|
|
9
|
-
this.isLoading = new BehaviorSubject(false);
|
|
10
|
-
}
|
|
11
|
-
start() {
|
|
12
|
-
this.isLoading.next(true);
|
|
13
|
-
}
|
|
14
|
-
stop() {
|
|
15
|
-
this.isLoading.next(false);
|
|
16
|
-
}
|
|
17
|
-
getAsObservable() {
|
|
18
|
-
return this.isLoading.asObservable();
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
LoaderService.ɵprov = i0.ɵɵdefineInjectable({ factory: function LoaderService_Factory() { return new LoaderService(); }, token: LoaderService, providedIn: "root" });
|
|
22
|
-
LoaderService.decorators = [
|
|
23
|
-
{ type: Injectable, args: [{
|
|
24
|
-
providedIn: 'root',
|
|
25
|
-
},] }
|
|
26
|
-
];
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL3NyYy9saWIvYmFzZS9zZXJ2aWNlcy9sb2FkZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7O0FBRW5EOztHQUVHO0FBSUgsTUFBTSxPQUFPLGFBQWE7SUFIMUI7UUFJUyxjQUFTLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7S0FhL0M7SUFYUSxLQUFLO1FBQ1YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVNLElBQUk7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRU0sZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdkMsQ0FBQzs7OztZQWhCRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBMb2FkZXIgc2VydmljZSBmb3IgbG9hZGluZyBpbmRpY2F0aW9uXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBMb2FkZXJTZXJ2aWNlIHtcbiAgcHVibGljIGlzTG9hZGluZyA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIHB1YmxpYyBzdGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzTG9hZGluZy5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgdGhpcy5pc0xvYWRpbmcubmV4dChmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXNPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmlzTG9hZGluZy5hc09ic2VydmFibGUoKTtcbiAgfVxufVxuIl19
|