ng-qubee 1.0.11 → 2.0.3

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.
Files changed (71) hide show
  1. package/README.md +90 -67
  2. package/esm2022/lib/enums/sort.enum.mjs +6 -0
  3. package/esm2022/lib/errors/key-not-found.error.mjs +6 -0
  4. package/esm2022/lib/errors/unselectable-model.error.mjs +6 -0
  5. package/esm2022/lib/interfaces/config.interface.mjs +2 -0
  6. package/esm2022/lib/interfaces/fields.interface.mjs +2 -0
  7. package/esm2022/lib/interfaces/filters.interface.mjs +2 -0
  8. package/esm2022/lib/interfaces/normalized.interface.mjs +2 -0
  9. package/esm2022/lib/interfaces/paginated-object.interface.mjs +2 -0
  10. package/esm2022/lib/interfaces/pagination-config.interface.mjs +2 -0
  11. package/esm2022/lib/interfaces/query-builder-config.interface.mjs +2 -0
  12. package/esm2022/lib/interfaces/query-builder-state.interface.mjs +2 -0
  13. package/esm2022/lib/interfaces/sort.interface.mjs +2 -0
  14. package/esm2022/lib/models/paginated-collection.mjs +47 -0
  15. package/esm2022/lib/models/query-builder-options.mjs +12 -0
  16. package/esm2022/lib/models/response-options.mjs +17 -0
  17. package/esm2022/lib/ng-qubee.module.mjs +42 -0
  18. package/esm2022/lib/provide-ngqubee.mjs +39 -0
  19. package/esm2022/lib/services/nest.service.mjs +173 -0
  20. package/esm2022/lib/services/ng-qubee.service.mjs +319 -0
  21. package/esm2022/lib/services/pagination.service.mjs +23 -0
  22. package/esm2022/ng-qubee.mjs +5 -0
  23. package/esm2022/public-api.mjs +9 -0
  24. package/{fesm2015/ng-qubee.js → fesm2022/ng-qubee.mjs} +369 -217
  25. package/fesm2022/ng-qubee.mjs.map +1 -0
  26. package/index.d.ts +5 -0
  27. package/lib/interfaces/normalized.interface.d.ts +3 -0
  28. package/lib/interfaces/paginated-object.interface.d.ts +3 -0
  29. package/lib/interfaces/query-builder-state.interface.d.ts +1 -2
  30. package/lib/interfaces/sort.interface.d.ts +2 -1
  31. package/lib/models/paginated-collection.d.ts +18 -16
  32. package/lib/ng-qubee.module.d.ts +4 -1
  33. package/lib/provide-ngqubee.d.ts +21 -0
  34. package/lib/services/nest.service.d.ts +81 -0
  35. package/lib/{ng-qubee.service.d.ts → services/ng-qubee.service.d.ts} +30 -8
  36. package/lib/services/pagination.service.d.ts +5 -1
  37. package/package.json +20 -18
  38. package/public-api.d.ts +3 -2
  39. package/bundles/ng-qubee.umd.js +0 -927
  40. package/bundles/ng-qubee.umd.js.map +0 -1
  41. package/bundles/ng-qubee.umd.min.js +0 -16
  42. package/bundles/ng-qubee.umd.min.js.map +0 -1
  43. package/esm2015/lib/actions/query-builder.actions.js +0 -17
  44. package/esm2015/lib/enums/sort.enum.js +0 -6
  45. package/esm2015/lib/errors/key-not-found.error.js +0 -6
  46. package/esm2015/lib/errors/unselectable-model.error.js +0 -6
  47. package/esm2015/lib/interfaces/config.interface.js +0 -2
  48. package/esm2015/lib/interfaces/fields.interface.js +0 -2
  49. package/esm2015/lib/interfaces/filters.interface.js +0 -2
  50. package/esm2015/lib/interfaces/nest-state.interface.js +0 -2
  51. package/esm2015/lib/interfaces/pagination-config.interface.js +0 -2
  52. package/esm2015/lib/interfaces/query-builder-config.interface.js +0 -2
  53. package/esm2015/lib/interfaces/query-builder-state.interface.js +0 -2
  54. package/esm2015/lib/interfaces/sort.interface.js +0 -2
  55. package/esm2015/lib/models/paginated-collection.js +0 -45
  56. package/esm2015/lib/models/query-builder-options.js +0 -12
  57. package/esm2015/lib/models/response-options.js +0 -17
  58. package/esm2015/lib/ng-qubee.module.js +0 -33
  59. package/esm2015/lib/ng-qubee.service.js +0 -298
  60. package/esm2015/lib/reducers/query-builder.reducer.js +0 -51
  61. package/esm2015/lib/services/pagination.service.js +0 -18
  62. package/esm2015/lib/services/store.service.js +0 -26
  63. package/esm2015/ng-qubee.js +0 -6
  64. package/esm2015/public-api.js +0 -8
  65. package/fesm2015/ng-qubee.js.map +0 -1
  66. package/lib/actions/query-builder.actions.d.ts +0 -43
  67. package/lib/interfaces/nest-state.interface.d.ts +0 -4
  68. package/lib/reducers/query-builder.reducer.d.ts +0 -2
  69. package/lib/services/store.service.d.ts +0 -9
  70. package/ng-qubee.d.ts +0 -7
  71. package/ng-qubee.metadata.json +0 -1
package/README.md CHANGED
@@ -1,103 +1,122 @@
1
- # NgQubee 🐝
2
- ## Your next Angular Query Builder
1
+ <p align="center">
2
+ <img width="500" height="500" src="https://i.ibb.co/LdXRKyG/logo.png">
3
+ </p>
3
4
 
4
- NgQubee is an NGRX (store based) Query Builder for Angular. Easily compose your API requests without the hassle of writing the wheel again :)
5
+ # Your next Angular Query Builder 🐝
6
+ NgQubee is a Query Builder for Angular. Easily compose your API requests without the hassle of writing the wheel again :)
5
7
 
6
- - Retrieve URIs easily with a Service
8
+ - Easily retrieve URIs with a Service
7
9
  - Pagination ready
8
10
  - Reactive, as the results are emitted with a RxJS Observable
9
11
  - Developed with a test-driven approach
10
12
 
11
13
  ## We love it, we use it ❤️
12
-
13
- NgQubee uses a number of open source projects to work properly:
14
-
15
- - [redux] - Store based with Redux
16
- - [rxjs] - URIs returned via Observables
17
- - [qs] - A querystring parsing and stringifying library with some added security.
14
+ NgQubee uses some open source projects to work properly:
15
+ - [rxjs] - URIs returned via Observables
16
+ - [qs] - A querystring parsing and stringifying library with some added security.
18
17
 
19
18
  And of course NgQubee itself is open source with a [public repository][ng-qubee] on GitHub.
20
19
 
21
20
  ## Installation
22
-
23
21
  Install NgQubee via NPM
24
22
 
25
23
  ```sh
26
- npm i ng-qubee
24
+ npm i ng-qubee
27
25
  ```
26
+
28
27
  ## Usage
29
28
  Import the module in your Angular app:
29
+
30
30
  ```typescript
31
31
  @NgModule({
32
- imports: [
33
- NgQubeeModule.forRoot({}) // You can omit the empty object as it is an optional argument
34
- ]
32
+ imports: [
33
+ NgQubeeModule.forRoot({}) // You can omit the empty object as it is an optional argument
34
+ ]
35
35
  })
36
- export class AppModule {}
36
+ export class AppModule {}
37
+ ```
38
+
39
+ Or if you are working with Angular 15 or greater, use the provide function:
40
+ ```typescript
41
+ const config = {};
42
+
43
+ bootstrapApplication(AppComponent, {
44
+ providers: [provideNgQubee(config)]
45
+ });
37
46
  ```
38
47
 
39
48
  The object given to the _forRoot_ method allows to customize the query param keys. Following, the default behaviour:
40
- - **Filters** are composed as filter[fieldName]=value / customizable with {request: {filters: 'yourFilterKey'}}
41
- - **Fields** are composed as fields[model]=id,email,username / customizable with {request: {fields: 'yourFieldsKey'}}
42
- - **Includes** are composed as include=modelA, modelB / customizable with {request: {includes: 'yourIncludeKey'}}
43
- - **Limit** is composed as limit=15 / customizable with {request: {limit: 'yourLimitKey'}}
44
- - **Page** is composed as page=1 / customizable with {request: {page: 'yourPageKey'}}
45
- - **Sort** is composed as sort=fieldName / customizable with {request: {sort: 'yourSortKey'}}
46
-
49
+
50
+ - **Filters** are composed as filter[fieldName]=value / customizable with {request: {filters: 'yourFilterKey'}}
51
+ - **Fields** are composed as fields[model]=id,email,username / customizable with {request: {fields: 'yourFieldsKey'}}
52
+ - **Includes** are composed as include=modelA, modelB / customizable with {request: {includes: 'yourIncludeKey'}}
53
+ - **Limit** is composed as limit=15 / customizable with {request: {limit: 'yourLimitKey'}}
54
+ - **Page** is composed as page=1 / customizable with {request: {page: 'yourPageKey'}}
55
+ - **Sort** is composed as sort=fieldName / customizable with {request: {sort: 'yourSortKey'}}
56
+
47
57
  As you can easily imagine, everything that regards the URI composition is placed into the "request" key.
48
- ```
58
+
59
+ ```typescript
49
60
  NgQubeeModule.forRoot({
50
- request: {
51
- filters: 'custom-filter-key',
52
- fields: 'custom-fields-key',
53
- /* and so on... */
54
- }
61
+ request: {
62
+ filters: 'custom-filter-key',
63
+ fields: 'custom-fields-key',
64
+ /* and so on... */
65
+ }
55
66
  })
56
67
  ```
57
68
 
58
69
  For composing queries, the first step is to inject the proper NgQubeeService:
70
+
59
71
  ```typescript
60
- @Injectable
61
- export class YourService {
62
- constructor(private _ngQubeeService: NgQubeeService) {}
72
+ @Injectable()
73
+ export class YourService {
74
+ constructor(private _ngQubeeService: NgQubeeService) {}
63
75
  }
64
76
  ```
65
77
 
66
78
  Set the **model** to run the query against:
79
+
67
80
  ```typescript
68
- this._ngQubeeService.setModel('users');
81
+ this._ngQubeeService.setModel('users');
69
82
  ```
70
83
 
71
- This is necessary to build the left part of the URI (/users)
84
+ This is necessary to build the prefix of the URI (/users)
85
+
72
86
 
73
87
  ### Fields
74
88
  Fields can be selected as following:
75
89
 
76
90
  ```typescript
77
- this._ngQubeeService.addFields('users', ['id', 'email']);
91
+ this._ngQubeeService.addFields('users', ['id', 'email']);
78
92
  ```
93
+
79
94
  Will output _/users?fields[users]=id,email_
80
95
 
81
96
  ### Filters
82
97
  Filters are applied as following:
83
98
 
84
99
  ```typescript
85
- this._ngQubeeService.addFilter('id', 5);
100
+ this._ngQubeeService.addFilter('id', 5);
86
101
  ```
102
+
87
103
  Will output _/users?filter[id]=5_
88
104
 
89
105
  Multiple values are allowed too:
106
+
90
107
  ```typescript
91
- this._ngQubeeService.addFilter('id', 5, 7, 10);
108
+ this._ngQubeeService.addFilter('id', 5, 7, 10);
92
109
  ```
93
110
 
94
111
  Will output _/users?filter[id]=5,7,10_
95
112
 
113
+
114
+
96
115
  ### Includes
97
116
  Ask to include related models with:
98
117
 
99
118
  ```typescript
100
- this._ngQubeeService.addIncludes('profile', 'settings');
119
+ this._ngQubeeService.addIncludes('profile', 'settings');
101
120
  ```
102
121
 
103
122
  Will output _/users?include=profile,settings_
@@ -122,8 +141,8 @@ this._ngQubeeService.setPage(2);
122
141
  Will output _/users?limit=25&page=2
123
142
 
124
143
  Default values are automatically added to the query:
125
- - **Limit**: 15
126
- - **Page**: 1
144
+ - **Limit**: 15
145
+ - **Page**: 1
127
146
 
128
147
  Always expect your query to include _limit=15&page=1_
129
148
 
@@ -131,7 +150,7 @@ Always expect your query to include _limit=15&page=1_
131
150
  URI is generated invoking the _generateUri_ method of the NgQubeeService. An observable is returned and the URI will be emitted:
132
151
 
133
152
  ```typescript
134
- this._ngQubeeService.generateUri().subscribe(uri => console.log(uri));
153
+ this._ngQubeeService.generateUri().subscribe(uri => console.log(uri));
135
154
  ```
136
155
 
137
156
  ### Reset state
@@ -143,45 +162,49 @@ this._ngQubeeService.reset();
143
162
 
144
163
  ## Pagination
145
164
  If you are working with an API that supports pagination, we have got you covered 😉 NgQubee provides:
146
- - A PaginatedCollection class that holds paginated data
147
- - A PaginationService that help to transform the response in a PaginatedCollection
165
+ - A PaginatedCollection class that holds paginated data
166
+ - A PaginationService that help to transform the response in a PaginatedCollection
148
167
 
149
168
  As a service, you have to inject the PaginationService first:
150
- ```
169
+
170
+ ```typescript
151
171
  constructor(private _pg: PaginationService) {}
152
172
  ```
153
173
 
154
- In the following example, the PaginationService is used to transform the response with the paginate method.
155
- ```
156
- this._pg.paginate<Model>({ ...response, data: response.data.map(e => new Model(e.id)) })
174
+ In the following example, the PaginationService is used to transform the response with the paginate method.
175
+
176
+ ```typescript
177
+ this._pg.paginate<Model>({ ...response, data: response.data.map(e => new Model(e.id)) })
157
178
  ```
179
+
158
180
  The "paginate" method returns a PaginatedCollection that helps handling paginated data. Additionally, if you are dealing with a state library in your application, you can use the "normalize" method of the collection to normalize the data.
159
181
 
160
182
  As you can see from the example, the paginate method requires a generic type: put there your model and you'll be provided with a PaginatedCollection<Model>. By default, the paginated collection will check for the following keys in the response:
161
- - data - the key that holds the response data
162
- - currentPage - requested page for the pagination
163
- - from - Showing items from n (where n is a number)
164
- - to - Showing items from n (where n is a number)
165
- - total - Count of the items available in thw whole pagination
166
- - perPage - Items per page
167
- - prevPageUrl - Url to the previous page
168
- - nextPageUrl - Url to the next page
169
- - lastPage - Last page number
170
- - firstPageUrl - Url to the first page
171
- - lastPageUrl - Url to the last page
172
-
183
+
184
+ - data - the key that holds the response data
185
+ - currentPage - requested page for the pagination
186
+ - from - Showing items from n (where n is a number)
187
+ - to - Showing items from n (where n is a number)
188
+ - total - Count of the items available in thw whole pagination
189
+ - perPage - Items per page
190
+ - prevPageUrl - Url to the previous page
191
+ - nextPageUrl - Url to the next page
192
+ - lastPage - Last page number
193
+ - firstPageUrl - Url to the first page
194
+ - lastPageUrl - Url to the last page
195
+
173
196
  Just like the query builder, the pagination service supports customizable keys. While invoking the forRoot method of the module, use the response key to look for different keys in the API response. Let's assume that the "currentPage" key is named "pg" in your API responseL your forRoot configuration will look as following:
174
- ```
197
+
198
+ ```typescript
175
199
  NgQubeeModule.forRoot({
176
- response: {
177
- currentPage: 'pg'
178
- }
200
+ response: {
201
+ currentPage: 'pg'
202
+ }
179
203
  })
180
204
  ```
181
205
 
182
206
  Feel free to customize your PaginationService as you need, using the keys shown in the upper list.
183
207
 
184
- [ng-qubee]: <https://github.com/AndrewReborn/ng-qubee>
185
- [redux]: <https://redux.js.org/>
186
- [rxjs]: <https://reactivex.io>
187
- [qs]: <https://github.com/ljharb/qs>
208
+ [ng-qubee]: <https://github.com/AndreaAlhena/ng-qubee>
209
+ [rxjs]: <https://reactivex.io>
210
+ [qs]: <https://github.com/ljharb/qs>
@@ -0,0 +1,6 @@
1
+ export var SortEnum;
2
+ (function (SortEnum) {
3
+ SortEnum["ASC"] = "asc";
4
+ SortEnum["DESC"] = "desc";
5
+ })(SortEnum || (SortEnum = {}));
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC5lbnVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcXViZWUvc3JjL2xpYi9lbnVtcy9zb3J0LmVudW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksUUFHWDtBQUhELFdBQVksUUFBUTtJQUNoQix1QkFBVyxDQUFBO0lBQ1gseUJBQWEsQ0FBQTtBQUNqQixDQUFDLEVBSFcsUUFBUSxLQUFSLFFBQVEsUUFHbkIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZW51bSBTb3J0RW51bSB7XG4gICAgQVNDID0gJ2FzYycsXG4gICAgREVTQyA9ICdkZXNjJ1xufSJdfQ==
@@ -0,0 +1,6 @@
1
+ export class KeyNotFoundError extends Error {
2
+ constructor(key) {
3
+ super(`Cannot find the key ${key} inside the collection item: does it really exists?`);
4
+ }
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LW5vdC1mb3VuZC5lcnJvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXF1YmVlL3NyYy9saWIvZXJyb3JzL2tleS1ub3QtZm91bmQuZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLGdCQUFpQixTQUFRLEtBQUs7SUFDdkMsWUFBWSxHQUFXO1FBQ25CLEtBQUssQ0FBQyx1QkFBdUIsR0FBRyxxREFBcUQsQ0FBQyxDQUFDO0lBQzNGLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBLZXlOb3RGb3VuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGBDYW5ub3QgZmluZCB0aGUga2V5ICR7a2V5fSBpbnNpZGUgdGhlIGNvbGxlY3Rpb24gaXRlbTogZG9lcyBpdCByZWFsbHkgZXhpc3RzP2ApO1xuICAgIH1cbn0iXX0=
@@ -0,0 +1,6 @@
1
+ export class UnselectableModelError extends Error {
2
+ constructor(model) {
3
+ super(`Unselectable Model: the selected model (${model}) is not present neither in the "model" property, nor in the includes object.`);
4
+ }
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zZWxlY3RhYmxlLW1vZGVsLmVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcXViZWUvc3JjL2xpYi9lcnJvcnMvdW5zZWxlY3RhYmxlLW1vZGVsLmVycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxLQUFLO0lBQzdDLFlBQVksS0FBYTtRQUNyQixLQUFLLENBQUMsMkNBQTJDLEtBQUssK0VBQStFLENBQUMsQ0FBQztJQUMzSSxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgVW5zZWxlY3RhYmxlTW9kZWxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihtb2RlbDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGBVbnNlbGVjdGFibGUgTW9kZWw6IHRoZSBzZWxlY3RlZCBtb2RlbCAoJHttb2RlbH0pIGlzIG5vdCBwcmVzZW50IG5laXRoZXIgaW4gdGhlIFwibW9kZWxcIiBwcm9wZXJ0eSwgbm9yIGluIHRoZSBpbmNsdWRlcyBvYmplY3QuYCk7XG4gICAgfVxufSJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXF1YmVlL3NyYy9saWIvaW50ZXJmYWNlcy9jb25maWcuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJUGFnaW5hdGlvbkNvbmZpZyB9IGZyb20gXCIuL3BhZ2luYXRpb24tY29uZmlnLmludGVyZmFjZVwiO1xuaW1wb3J0IHsgSVF1ZXJ5QnVpbGRlckNvbmZpZyB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXItY29uZmlnLmludGVyZmFjZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDb25maWcge1xuICAgIHJlcXVlc3Q/OiBJUXVlcnlCdWlsZGVyQ29uZmlnLFxuICAgIHJlc3BvbnNlPzogSVBhZ2luYXRpb25Db25maWdcbn0iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXF1YmVlL3NyYy9saWIvaW50ZXJmYWNlcy9maWVsZHMuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIElGaWVsZHMge1xuICAgIFttb2RlbDogc3RyaW5nXTogc3RyaW5nW107XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1xdWJlZS9zcmMvbGliL2ludGVyZmFjZXMvZmlsdGVycy5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgSUZpbHRlcnMge1xuICAgIFtrOiBzdHJpbmddOiAoc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbilbXTtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXplZC5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1xdWJlZS9zcmMvbGliL2ludGVyZmFjZXMvbm9ybWFsaXplZC5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgSU5vcm1hbGl6ZWQge1xuICAgIFtrOiBudW1iZXIgfCBzdHJpbmddOiBudW1iZXJbXSB8IHN0cmluZ1tdXG59Il19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGVkLW9iamVjdC5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1xdWJlZS9zcmMvbGliL2ludGVyZmFjZXMvcGFnaW5hdGVkLW9iamVjdC5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgSVBhZ2luYXRlZE9iamVjdCB7XG4gICAgW2s6IHN0cmluZ106IGFueTtcbn0iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi1jb25maWcuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcXViZWUvc3JjL2xpYi9pbnRlcmZhY2VzL3BhZ2luYXRpb24tY29uZmlnLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJUGFnaW5hdGlvbkNvbmZpZyB7XG4gICAgY3VycmVudFBhZ2U/OiBzdHJpbmc7XG4gICAgZGF0YT86IHN0cmluZztcbiAgICBmaXJzdFBhZ2VVcmw/OiBzdHJpbmc7XG4gICAgZnJvbT86IHN0cmluZztcbiAgICBsYXN0UGFnZT86IHN0cmluZztcbiAgICBsYXN0UGFnZVVybD86IHN0cmluZztcbiAgICBuZXh0UGFnZVVybD86IHN0cmluZztcbiAgICBwYXRoPzogc3RyaW5nO1xuICAgIHBlclBhZ2U/OiBzdHJpbmc7XG4gICAgcHJldlBhZ2VVcmw/OiBzdHJpbmc7XG4gICAgdG8/OiBzdHJpbmc7XG4gICAgdG90YWw/OiBzdHJpbmc7XG59Il19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlci1jb25maWcuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcXViZWUvc3JjL2xpYi9pbnRlcmZhY2VzL3F1ZXJ5LWJ1aWxkZXItY29uZmlnLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJUXVlcnlCdWlsZGVyQ29uZmlnIHtcbiAgICBhcHBlbmRzPzogc3RyaW5nO1xuICAgIGZpZWxkcz86IHN0cmluZztcbiAgICBmaWx0ZXJzPzogc3RyaW5nO1xuICAgIGluY2x1ZGVzPzogc3RyaW5nO1xuICAgIGxpbWl0Pzogc3RyaW5nO1xuICAgIHBhZ2U/OiBzdHJpbmc7XG4gICAgc29ydD86IHN0cmluZztcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlci1zdGF0ZS5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1xdWJlZS9zcmMvbGliL2ludGVyZmFjZXMvcXVlcnktYnVpbGRlci1zdGF0ZS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElGaWVsZHMgfSBmcm9tIFwiLi9maWVsZHMuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBJRmlsdGVycyB9IGZyb20gXCIuL2ZpbHRlcnMuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBJU29ydCB9IGZyb20gXCIuL3NvcnQuaW50ZXJmYWNlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVF1ZXJ5QnVpbGRlclN0YXRlIHtcbiAgICBiYXNlVXJsOiBzdHJpbmc7XG4gICAgZmllbGRzOiBJRmllbGRzO1xuICAgIGZpbHRlcnM6IElGaWx0ZXJzO1xuICAgIGluY2x1ZGVzOiBzdHJpbmdbXTtcbiAgICBsaW1pdDogbnVtYmVyO1xuICAgIG1vZGVsOiBzdHJpbmc7XG4gICAgcGFnZTogbnVtYmVyLFxuICAgIHNvcnRzOiBJU29ydFtdO1xufSJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1xdWJlZS9zcmMvbGliL2ludGVyZmFjZXMvc29ydC5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNvcnRFbnVtIH0gZnJvbSBcIi4uL2VudW1zL3NvcnQuZW51bVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElTb3J0IHtcbiAgICBmaWVsZDogc3RyaW5nO1xuICAgIG9yZGVyOiBTb3J0RW51bVxufSJdfQ==
@@ -0,0 +1,47 @@
1
+ import { KeyNotFoundError } from "../errors/key-not-found.error";
2
+ export class PaginatedCollection {
3
+ constructor(data, page, from, to, total, perPage, prevPageUrl, nextPageUrl, lastPage, firstPageUrl, lastPageUrl) {
4
+ this.data = data;
5
+ this.page = page;
6
+ this.from = from;
7
+ this.to = to;
8
+ this.total = total;
9
+ this.perPage = perPage;
10
+ this.prevPageUrl = prevPageUrl;
11
+ this.nextPageUrl = nextPageUrl;
12
+ this.lastPage = lastPage;
13
+ this.firstPageUrl = firstPageUrl;
14
+ this.lastPageUrl = lastPageUrl;
15
+ //
16
+ }
17
+ /**
18
+ * Normalize the collection to a paginated list of ids for state-managed applications.
19
+ *
20
+ * This method returns a single key object, where the key is the page number and the associated value is
21
+ * an array of ids. Each id is fetched by the collection items, looking up for the "id" key. If an id is supplied
22
+ * to this method, it will be used instead of the default "id" key.
23
+ *
24
+ * Please note that in case the key doesn't exist in the collection's item, a KeyNotFoundError is thrown
25
+ *
26
+ * @param k A key to use instead of the default "id": this will be searched inside each element of the collection
27
+ * @returns []
28
+ * @throws KeyNotFoundItem
29
+ */
30
+ normalize(id) {
31
+ return {
32
+ [this.page]: this.data.reduce((ids, value) => {
33
+ if (id && id in value) {
34
+ ids.push(value[id]);
35
+ }
36
+ else if (value.hasOwnProperty('id')) {
37
+ ids.push(value['id']);
38
+ }
39
+ else {
40
+ throw new KeyNotFoundError(id || 'id');
41
+ }
42
+ return ids;
43
+ }, [])
44
+ };
45
+ }
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGVkLWNvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1xdWJlZS9zcmMvbGliL21vZGVscy9wYWdpbmF0ZWQtY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUlqRSxNQUFNLE9BQU8sbUJBQW1CO0lBQzVCLFlBQ1csSUFBUyxFQUNBLElBQVksRUFDWixJQUFhLEVBQ2IsRUFBVyxFQUNYLEtBQWMsRUFDZCxPQUFnQixFQUNoQixXQUFvQixFQUNwQixXQUFvQixFQUNwQixRQUFpQixFQUNqQixZQUFxQixFQUNyQixXQUFvQjtRQVY3QixTQUFJLEdBQUosSUFBSSxDQUFLO1FBQ0EsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFNBQUksR0FBSixJQUFJLENBQVM7UUFDYixPQUFFLEdBQUYsRUFBRSxDQUFTO1FBQ1gsVUFBSyxHQUFMLEtBQUssQ0FBUztRQUNkLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIsZ0JBQVcsR0FBWCxXQUFXLENBQVM7UUFDcEIsZ0JBQVcsR0FBWCxXQUFXLENBQVM7UUFDcEIsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQixpQkFBWSxHQUFaLFlBQVksQ0FBUztRQUNyQixnQkFBVyxHQUFYLFdBQVcsQ0FBUztRQUVwQyxFQUFFO0lBQ04sQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNJLFNBQVMsQ0FBQyxFQUFXO1FBQ3hCLE9BQU87WUFDSCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQWEsRUFBRSxLQUFRLEVBQUUsRUFBRTtnQkFDdEQsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEtBQUssRUFBRTtvQkFDbkIsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDdkI7cUJBQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNuQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2lCQUN6QjtxQkFBTTtvQkFDSCxNQUFNLElBQUksZ0JBQWdCLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDO2lCQUMxQztnQkFFRCxPQUFPLEdBQUcsQ0FBQztZQUNmLENBQUMsRUFBRSxFQUFFLENBQUM7U0FDVCxDQUFBO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS2V5Tm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMva2V5LW5vdC1mb3VuZC5lcnJvclwiO1xuaW1wb3J0IHsgSU5vcm1hbGl6ZWQgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9ub3JtYWxpemVkLmludGVyZmFjZVwiO1xuaW1wb3J0IHsgSVBhZ2luYXRlZE9iamVjdCB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL3BhZ2luYXRlZC1vYmplY3QuaW50ZXJmYWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBQYWdpbmF0ZWRDb2xsZWN0aW9uPFQgZXh0ZW5kcyBJUGFnaW5hdGVkT2JqZWN0PiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBkYXRhOiBUW10sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwYWdlOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBmcm9tPzogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdG8/OiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB0b3RhbD86IG51bWJlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHBlclBhZ2U/OiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwcmV2UGFnZVVybD86IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG5leHRQYWdlVXJsPzogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbGFzdFBhZ2U/OiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBmaXJzdFBhZ2VVcmw/OiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBsYXN0UGFnZVVybD86IHN0cmluZ1xuICAgICkge1xuICAgICAgICAvL1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZSB0aGUgY29sbGVjdGlvbiB0byBhIHBhZ2luYXRlZCBsaXN0IG9mIGlkcyBmb3Igc3RhdGUtbWFuYWdlZCBhcHBsaWNhdGlvbnMuXG4gICAgICogXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHNpbmdsZSBrZXkgb2JqZWN0LCB3aGVyZSB0aGUga2V5IGlzIHRoZSBwYWdlIG51bWJlciBhbmQgdGhlIGFzc29jaWF0ZWQgdmFsdWUgaXNcbiAgICAgKiBhbiBhcnJheSBvZiBpZHMuIEVhY2ggaWQgaXMgZmV0Y2hlZCBieSB0aGUgY29sbGVjdGlvbiBpdGVtcywgbG9va2luZyB1cCBmb3IgdGhlIFwiaWRcIiBrZXkuIElmIGFuIGlkIGlzIHN1cHBsaWVkXG4gICAgICogdG8gdGhpcyBtZXRob2QsIGl0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IFwiaWRcIiBrZXkuXG4gICAgICogXG4gICAgICogUGxlYXNlIG5vdGUgdGhhdCBpbiBjYXNlIHRoZSBrZXkgZG9lc24ndCBleGlzdCBpbiB0aGUgY29sbGVjdGlvbidzIGl0ZW0sIGEgS2V5Tm90Rm91bmRFcnJvciBpcyB0aHJvd25cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gayBBIGtleSB0byB1c2UgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBcImlkXCI6IHRoaXMgd2lsbCBiZSBzZWFyY2hlZCBpbnNpZGUgZWFjaCBlbGVtZW50IG9mIHRoZSBjb2xsZWN0aW9uXG4gICAgICogQHJldHVybnMgW11cbiAgICAgKiBAdGhyb3dzIEtleU5vdEZvdW5kSXRlbVxuICAgICAqL1xuICAgIHB1YmxpYyBub3JtYWxpemUoaWQ/OiBzdHJpbmcpOiBJTm9ybWFsaXplZCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBbdGhpcy5wYWdlXTogdGhpcy5kYXRhLnJlZHVjZSgoaWRzOiBudW1iZXJbXSwgdmFsdWU6IFQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaWQgJiYgaWQgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWRzLnB1c2godmFsdWVbaWRdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKHZhbHVlWydpZCddKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgS2V5Tm90Rm91bmRFcnJvcihpZCB8fCAnaWQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaWRzO1xuICAgICAgICAgICAgfSwgW10pXG4gICAgICAgIH1cbiAgICB9XG59Il19
@@ -0,0 +1,12 @@
1
+ export class QueryBuilderOptions {
2
+ constructor(options) {
3
+ this.appends = options.appends || 'append';
4
+ this.fields = options.fields || 'fields';
5
+ this.filters = options.filters || 'filter';
6
+ this.includes = options.includes || 'include';
7
+ this.limit = options.limit || 'limit';
8
+ this.page = options.page || 'page';
9
+ this.sort = options.sort || 'sort';
10
+ }
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlci1vcHRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcXViZWUvc3JjL2xpYi9tb2RlbHMvcXVlcnktYnVpbGRlci1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyxtQkFBbUI7SUFTNUIsWUFBWSxPQUE0QjtRQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUM7UUFDekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQztRQUMzQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDO0lBQ3ZDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElRdWVyeUJ1aWxkZXJDb25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3F1ZXJ5LWJ1aWxkZXItY29uZmlnLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeUJ1aWxkZXJPcHRpb25zIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXBwZW5kczogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBmaWVsZHM6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyczogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBpbmNsdWRlczogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBsaW1pdDogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBwYWdlOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHNvcnQ6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElRdWVyeUJ1aWxkZXJDb25maWcpIHtcbiAgICAgICAgdGhpcy5hcHBlbmRzID0gb3B0aW9ucy5hcHBlbmRzIHx8ICdhcHBlbmQnO1xuICAgICAgICB0aGlzLmZpZWxkcyA9IG9wdGlvbnMuZmllbGRzIHx8ICdmaWVsZHMnO1xuICAgICAgICB0aGlzLmZpbHRlcnMgPSBvcHRpb25zLmZpbHRlcnMgfHwgJ2ZpbHRlcic7XG4gICAgICAgIHRoaXMuaW5jbHVkZXMgPSBvcHRpb25zLmluY2x1ZGVzIHx8ICdpbmNsdWRlJztcbiAgICAgICAgdGhpcy5saW1pdCA9IG9wdGlvbnMubGltaXQgfHwgJ2xpbWl0JztcbiAgICAgICAgdGhpcy5wYWdlID0gb3B0aW9ucy5wYWdlIHx8ICdwYWdlJztcbiAgICAgICAgdGhpcy5zb3J0ID0gb3B0aW9ucy5zb3J0IHx8ICdzb3J0JztcbiAgICB9XG59Il19
@@ -0,0 +1,17 @@
1
+ export class ResponseOptions {
2
+ constructor(options) {
3
+ this.currentPage = options.currentPage || 'current_page';
4
+ this.data = options.data || 'data';
5
+ this.firstPageUrl = options.firstPageUrl || 'first_page_url';
6
+ this.from = options.from || 'from';
7
+ this.lastPage = options.lastPage || 'last_page';
8
+ this.lastPageUrl = options.lastPageUrl || 'last_page_url';
9
+ this.nextPageUrl = options.nextPageUrl || 'next_page_url';
10
+ this.path = options.path || 'path';
11
+ this.perPage = options.perPage || 'per_page';
12
+ this.prevPageUrl = options.prevPageUrl || 'prev_page_url';
13
+ this.to = options.to || 'to';
14
+ this.total = options.total || 'total';
15
+ }
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2Utb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXF1YmVlL3NyYy9saWIvbW9kZWxzL3Jlc3BvbnNlLW9wdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxPQUFPLGVBQWU7SUFjeEIsWUFBWSxPQUEwQjtRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLElBQUksY0FBYyxDQUFDO1FBQ3pELElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxJQUFJLGdCQUFnQixDQUFDO1FBQzdELElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxJQUFJLFdBQVcsQ0FBQztRQUNoRCxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLElBQUksZUFBZSxDQUFDO1FBQzFELElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxlQUFlLENBQUM7UUFDMUQsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDO1FBQzdDLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxlQUFlLENBQUM7UUFDMUQsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDO0lBQzFDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElQYWdpbmF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wYWdpbmF0aW9uLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVF1ZXJ5QnVpbGRlckNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcXVlcnktYnVpbGRlci1jb25maWcuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIFJlc3BvbnNlT3B0aW9ucyB7XG4gICAgcHVibGljIHJlYWRvbmx5IGN1cnJlbnRQYWdlOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGRhdGE6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmlyc3RQYWdlVXJsOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGZyb206IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgbGFzdFBhZ2U6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgbGFzdFBhZ2VVcmw6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmV4dFBhZ2VVcmw6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBwZXJQYWdlOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHByZXZQYWdlVXJsOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHRvOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHRvdGFsOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJUGFnaW5hdGlvbkNvbmZpZykge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gb3B0aW9ucy5jdXJyZW50UGFnZSB8fCAnY3VycmVudF9wYWdlJztcbiAgICAgICAgdGhpcy5kYXRhID0gb3B0aW9ucy5kYXRhIHx8ICdkYXRhJztcbiAgICAgICAgdGhpcy5maXJzdFBhZ2VVcmwgPSBvcHRpb25zLmZpcnN0UGFnZVVybCB8fCAnZmlyc3RfcGFnZV91cmwnO1xuICAgICAgICB0aGlzLmZyb20gPSBvcHRpb25zLmZyb20gfHwgJ2Zyb20nO1xuICAgICAgICB0aGlzLmxhc3RQYWdlID0gb3B0aW9ucy5sYXN0UGFnZSB8fCAnbGFzdF9wYWdlJztcbiAgICAgICAgdGhpcy5sYXN0UGFnZVVybCA9IG9wdGlvbnMubGFzdFBhZ2VVcmwgfHwgJ2xhc3RfcGFnZV91cmwnO1xuICAgICAgICB0aGlzLm5leHRQYWdlVXJsID0gb3B0aW9ucy5uZXh0UGFnZVVybCB8fCAnbmV4dF9wYWdlX3VybCc7XG4gICAgICAgIHRoaXMucGF0aCA9IG9wdGlvbnMucGF0aCB8fCAncGF0aCc7XG4gICAgICAgIHRoaXMucGVyUGFnZSA9IG9wdGlvbnMucGVyUGFnZSB8fCAncGVyX3BhZ2UnO1xuICAgICAgICB0aGlzLnByZXZQYWdlVXJsID0gb3B0aW9ucy5wcmV2UGFnZVVybCB8fCAncHJldl9wYWdlX3VybCc7XG4gICAgICAgIHRoaXMudG8gPSBvcHRpb25zLnRvIHx8ICd0byc7XG4gICAgICAgIHRoaXMudG90YWwgPSBvcHRpb25zLnRvdGFsIHx8ICd0b3RhbCc7XG4gICAgfVxufSJdfQ==
@@ -0,0 +1,42 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { NgQubeeService } from './services/ng-qubee.service';
3
+ import { PaginationService } from './services/pagination.service';
4
+ import { NestService } from './services/nest.service';
5
+ import * as i0 from "@angular/core";
6
+ // @dynamic
7
+ export class NgQubeeModule {
8
+ static forRoot(config = {}) {
9
+ return {
10
+ ngModule: NgQubeeModule,
11
+ providers: [
12
+ NestService,
13
+ {
14
+ deps: [NestService],
15
+ provide: NgQubeeService,
16
+ useFactory: (nestService) => new NgQubeeService(nestService, Object.assign({}, config.request))
17
+ }, {
18
+ provide: PaginationService,
19
+ useFactory: () => new PaginationService(Object.assign({}, config.response))
20
+ }
21
+ ]
22
+ };
23
+ }
24
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NgQubeeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.1.3", ngImport: i0, type: NgQubeeModule }); }
26
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NgQubeeModule, providers: [{
27
+ deps: [NestService],
28
+ provide: NgQubeeService,
29
+ useFactory: (nestService) => new NgQubeeService(nestService, {})
30
+ }] }); }
31
+ }
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NgQubeeModule, decorators: [{
33
+ type: NgModule,
34
+ args: [{
35
+ providers: [{
36
+ deps: [NestService],
37
+ provide: NgQubeeService,
38
+ useFactory: (nestService) => new NgQubeeService(nestService, {})
39
+ }]
40
+ }]
41
+ }] });
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctcXViZWUubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcXViZWUvc3JjL2xpYi9uZy1xdWJlZS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF1QixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFFdEQsV0FBVztBQVFYLE1BQU0sT0FBTyxhQUFhO0lBQ2pCLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBa0IsRUFBRTtRQUN4QyxPQUFPO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsU0FBUyxFQUFFO2dCQUNULFdBQVc7Z0JBQ1g7b0JBQ0UsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDO29CQUNuQixPQUFPLEVBQUUsY0FBYztvQkFDdkIsVUFBVSxFQUFFLENBQUMsV0FBd0IsRUFBRSxFQUFFLENBQ3ZDLElBQUksY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3JFLEVBQUU7b0JBQ0QsT0FBTyxFQUFFLGlCQUFpQjtvQkFDMUIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUNmLElBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUM1RDthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7OEdBbEJVLGFBQWE7K0dBQWIsYUFBYTsrR0FBYixhQUFhLGFBTmIsQ0FBQztnQkFDVixJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUM7Z0JBQ25CLE9BQU8sRUFBRSxjQUFjO2dCQUN2QixVQUFVLEVBQUUsQ0FBQyxXQUF3QixFQUFFLEVBQUUsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2FBQzlFLENBQUM7OzJGQUVTLGFBQWE7a0JBUHpCLFFBQVE7bUJBQUM7b0JBQ1IsU0FBUyxFQUFFLENBQUM7NEJBQ1YsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDOzRCQUNuQixPQUFPLEVBQUUsY0FBYzs0QkFDdkIsVUFBVSxFQUFFLENBQUMsV0FBd0IsRUFBRSxFQUFFLENBQUMsSUFBSSxjQUFjLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQzt5QkFDOUUsQ0FBQztpQkFDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ1F1YmVlU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvbmctcXViZWUuc2VydmljZSc7XG5pbXBvcnQgeyBJQ29uZmlnIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2NvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUGFnaW5hdGlvblNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3BhZ2luYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBOZXN0U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvbmVzdC5zZXJ2aWNlJztcblxuLy8gQGR5bmFtaWNcbkBOZ01vZHVsZSh7XG4gIHByb3ZpZGVyczogW3tcbiAgICBkZXBzOiBbTmVzdFNlcnZpY2VdLFxuICAgIHByb3ZpZGU6IE5nUXViZWVTZXJ2aWNlLFxuICAgIHVzZUZhY3Rvcnk6IChuZXN0U2VydmljZTogTmVzdFNlcnZpY2UpID0+IG5ldyBOZ1F1YmVlU2VydmljZShuZXN0U2VydmljZSwge30pXG4gIH1dXG59KVxuZXhwb3J0IGNsYXNzIE5nUXViZWVNb2R1bGUge1xuICBwdWJsaWMgc3RhdGljIGZvclJvb3QoY29uZmlnOiBJQ29uZmlnID0ge30pOiBNb2R1bGVXaXRoUHJvdmlkZXJzPE5nUXViZWVNb2R1bGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IE5nUXViZWVNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgTmVzdFNlcnZpY2UsXG4gICAgICAgIHtcbiAgICAgICAgICBkZXBzOiBbTmVzdFNlcnZpY2VdLFxuICAgICAgICAgIHByb3ZpZGU6IE5nUXViZWVTZXJ2aWNlLFxuICAgICAgICAgIHVzZUZhY3Rvcnk6IChuZXN0U2VydmljZTogTmVzdFNlcnZpY2UpID0+XG4gICAgICAgICAgICBuZXcgTmdRdWJlZVNlcnZpY2UobmVzdFNlcnZpY2UsIE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZy5yZXF1ZXN0KSlcbiAgICAgICAgfSwge1xuICAgICAgICAgIHByb3ZpZGU6IFBhZ2luYXRpb25TZXJ2aWNlLFxuICAgICAgICAgIHVzZUZhY3Rvcnk6ICgpID0+XG4gICAgICAgICAgICBuZXcgUGFnaW5hdGlvblNlcnZpY2UoT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnLnJlc3BvbnNlKSlcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,39 @@
1
+ import { makeEnvironmentProviders } from "@angular/core";
2
+ import { NgQubeeService } from "./services/ng-qubee.service";
3
+ import { PaginationService } from "./services/pagination.service";
4
+ import { NestService } from "./services/nest.service";
5
+ /**
6
+ * Sets up providers necessary to enable `NgQubee` functionality for the application.
7
+ *
8
+ * @usageNotes
9
+ *
10
+ * Basic example of how you can add NgQubee to your application:
11
+ * ```
12
+ * const config = {};
13
+ *
14
+ * bootstrapApplication(AppComponent, {
15
+ * providers: [provideNgQubee(config)]
16
+ * });
17
+ * ```
18
+ *
19
+ * @publicApi
20
+ * @param config Configuration object compliant to the IConfig interface
21
+ * @returns A set of providers to setup NgQubee
22
+ */
23
+ export function provideNgQubee(config = {}) {
24
+ return makeEnvironmentProviders([
25
+ {
26
+ provide: NestService,
27
+ useClass: NestService
28
+ },
29
+ {
30
+ deps: [NestService],
31
+ provide: NgQubeeService,
32
+ useFactory: (nestService) => new NgQubeeService(nestService, Object.assign({}, config.request))
33
+ }, {
34
+ provide: PaginationService,
35
+ useFactory: () => new PaginationService(Object.assign({}, config.response))
36
+ }
37
+ ]);
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1uZ3F1YmVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcXViZWUvc3JjL2xpYi9wcm92aWRlLW5ncXViZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF3Qix3QkFBd0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXREOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsU0FBa0IsRUFBRTtJQUNqRCxPQUFPLHdCQUF3QixDQUFDO1FBQzlCO1lBQ0UsT0FBTyxFQUFFLFdBQVc7WUFDcEIsUUFBUSxFQUFFLFdBQVc7U0FDdEI7UUFDRDtZQUNFLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUNuQixPQUFPLEVBQUUsY0FBYztZQUN2QixVQUFVLEVBQUUsQ0FBQyxXQUF3QixFQUFFLEVBQUUsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdHLEVBQUU7WUFDRCxPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUM1RTtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnZpcm9ubWVudFByb3ZpZGVycywgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IElDb25maWcgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2NvbmZpZy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IE5nUXViZWVTZXJ2aWNlIH0gZnJvbSBcIi4vc2VydmljZXMvbmctcXViZWUuc2VydmljZVwiO1xuaW1wb3J0IHsgUGFnaW5hdGlvblNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy9wYWdpbmF0aW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IE5lc3RTZXJ2aWNlIH0gZnJvbSBcIi4vc2VydmljZXMvbmVzdC5zZXJ2aWNlXCI7XG5cbi8qKlxuICogU2V0cyB1cCBwcm92aWRlcnMgbmVjZXNzYXJ5IHRvIGVuYWJsZSBgTmdRdWJlZWAgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogQmFzaWMgZXhhbXBsZSBvZiBob3cgeW91IGNhbiBhZGQgTmdRdWJlZSB0byB5b3VyIGFwcGxpY2F0aW9uOlxuICogYGBgXG4gKiBjb25zdCBjb25maWcgPSB7fTtcbiAqIFxuICogYm9vdHN0cmFwQXBwbGljYXRpb24oQXBwQ29tcG9uZW50LCB7XG4gKiAgIHByb3ZpZGVyczogW3Byb3ZpZGVOZ1F1YmVlKGNvbmZpZyldXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNBcGlcbiAqIEBwYXJhbSBjb25maWcgQ29uZmlndXJhdGlvbiBvYmplY3QgY29tcGxpYW50IHRvIHRoZSBJQ29uZmlnIGludGVyZmFjZVxuICogQHJldHVybnMgQSBzZXQgb2YgcHJvdmlkZXJzIHRvIHNldHVwIE5nUXViZWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVOZ1F1YmVlKGNvbmZpZzogSUNvbmZpZyA9IHt9KTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOZXN0U2VydmljZSxcbiAgICAgIHVzZUNsYXNzOiBOZXN0U2VydmljZVxuICAgIH0sXG4gICAge1xuICAgICAgZGVwczogW05lc3RTZXJ2aWNlXSxcbiAgICAgIHByb3ZpZGU6IE5nUXViZWVTZXJ2aWNlLFxuICAgICAgdXNlRmFjdG9yeTogKG5lc3RTZXJ2aWNlOiBOZXN0U2VydmljZSkgPT4gbmV3IE5nUXViZWVTZXJ2aWNlKG5lc3RTZXJ2aWNlLCBPYmplY3QuYXNzaWduKHt9LCBjb25maWcucmVxdWVzdCkpXG4gICAgfSwge1xuICAgICAgcHJvdmlkZTogUGFnaW5hdGlvblNlcnZpY2UsXG4gICAgICB1c2VGYWN0b3J5OiAoKSA9PiBuZXcgUGFnaW5hdGlvblNlcnZpY2UoT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnLnJlc3BvbnNlKSlcbiAgICB9XG4gIF0pO1xufSJdfQ==