@progalaxyelabs/ngx-stonescriptphp-client 0.0.10 → 1.0.4

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 (31) hide show
  1. package/HLD.md +31 -0
  2. package/LICENSE +21 -0
  3. package/README.md +89 -2
  4. package/dist/ngx-stonescriptphp-client/README.md +186 -0
  5. package/{fesm2022 → dist/ngx-stonescriptphp-client/fesm2022}/progalaxyelabs-ngx-stonescriptphp-client.mjs +262 -46
  6. package/dist/ngx-stonescriptphp-client/fesm2022/progalaxyelabs-ngx-stonescriptphp-client.mjs.map +1 -0
  7. package/dist/ngx-stonescriptphp-client/index.d.ts +184 -0
  8. package/docs/AUTH_COMPATIBILITY.md +310 -0
  9. package/docs/CHANGELOG.md +261 -0
  10. package/package.json +75 -18
  11. package/esm2022/lib/api-connection.service.mjs +0 -169
  12. package/esm2022/lib/api-response.model.mjs +0 -26
  13. package/esm2022/lib/auth.service.mjs +0 -14
  14. package/esm2022/lib/db.service.mjs +0 -14
  15. package/esm2022/lib/my-environment.model.mjs +0 -19
  16. package/esm2022/lib/ngx-stonescriptphp-client/ngx-stonescriptphp-client.module.mjs +0 -27
  17. package/esm2022/lib/signin-status.service.mjs +0 -23
  18. package/esm2022/lib/token.service.mjs +0 -55
  19. package/esm2022/progalaxyelabs-ngx-stonescriptphp-client.mjs +0 -5
  20. package/esm2022/public-api.mjs +0 -12
  21. package/fesm2022/progalaxyelabs-ngx-stonescriptphp-client.mjs.map +0 -1
  22. package/index.d.ts +0 -5
  23. package/lib/api-connection.service.d.ts +0 -23
  24. package/lib/api-response.model.d.ts +0 -9
  25. package/lib/auth.service.d.ts +0 -6
  26. package/lib/db.service.d.ts +0 -6
  27. package/lib/my-environment.model.d.ts +0 -20
  28. package/lib/ngx-stonescriptphp-client/ngx-stonescriptphp-client.module.d.ts +0 -10
  29. package/lib/signin-status.service.d.ts +0 -10
  30. package/lib/token.service.d.ts +0 -14
  31. package/public-api.d.ts +0 -8
@@ -0,0 +1,261 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.0.0] - 2025-12-14
9
+
10
+ ### 🎉 Production Ready Release
11
+
12
+ This is the first stable production release of `@progalaxyelabs/ngx-stonescriptphp-client`.
13
+
14
+ #### Repository Organization
15
+ - **Documentation**: Moved CHANGELOG.md and AUTH_COMPATIBILITY.md to `docs/` folder
16
+ - **Project Structure**: Cleaned up root directory - only README.md and HLD.md remain
17
+ - **.gitignore**: Updated for proper npm package exclusions
18
+ - **package.json**: Added `docs` folder to published files
19
+
20
+ #### Why 1.0.0?
21
+ - ✅ Full compatibility with StoneScriptPHP Framework v2.1.x
22
+ - ✅ All major HTTP methods implemented (GET, POST, PUT, PATCH, DELETE)
23
+ - ✅ Configurable authentication modes (cookie/body/none)
24
+ - ✅ CSRF protection support
25
+ - ✅ Comprehensive documentation
26
+ - ✅ Clean repository structure
27
+ - ✅ Production-ready and stable API
28
+
29
+ **No code changes from v0.0.15** - purely organizational improvements and version bump to indicate production readiness.
30
+
31
+ ---
32
+
33
+ ## [0.0.15] - 2025-12-14 (Pre-release)
34
+
35
+ ### 🎉 Major Feature: Configurable Authentication Modes
36
+
37
+ This release adds **full compatibility with StoneScriptPHP Framework v2.1.x authentication** while maintaining backward compatibility.
38
+
39
+ ### Added
40
+
41
+ #### Authentication Configuration
42
+ - **`AuthConfig` interface**: Configure authentication mode, endpoints, and CSRF settings
43
+ - **`AuthMode` type**: Choose between `'cookie'`, `'body'`, or `'none'` authentication modes
44
+ - **Cookie-based auth mode**: Full support for StoneScriptPHP v2.1.x secure httpOnly cookie + CSRF auth (recommended)
45
+ - **Body-based auth mode**: Legacy mode for custom backends (sends tokens in request body)
46
+ - **No-auth mode**: Disable automatic token refresh for manual auth management
47
+
48
+ #### New Services & Methods
49
+ - **`CsrfService`**: Manage CSRF tokens from cookies for secure authentication
50
+ - **`TokenService.setAccessToken()`**: Set only access token
51
+ - **`TokenService.setRefreshToken()`**: Set only refresh token
52
+ - **`MyEnvironmentModel.auth`**: Authentication configuration object
53
+
54
+ ### Changed
55
+
56
+ #### Auth Mode Configuration (Breaking Change with Migration Path)
57
+ - **Default auth mode**: Now defaults to `'cookie'` mode (StoneScriptPHP v2.1.x compatible)
58
+ - **Token refresh**: Completely rewritten to support multiple auth strategies:
59
+ - **Cookie mode**: Uses httpOnly cookies + CSRF tokens, calls `/auth/refresh` (default)
60
+ - **Body mode**: Sends tokens in request body (legacy), calls `/user/refresh_access`
61
+ - **None mode**: Disables automatic token refresh
62
+
63
+ #### Migration Guide for v0.0.10 → v0.0.15
64
+
65
+ **For StoneScriptPHP v2.1.x users (recommended):**
66
+ ```typescript
67
+ // environment.ts
68
+ export const environment = {
69
+ apiServer: { host: 'http://localhost:8000/' },
70
+ auth: {
71
+ mode: 'cookie', // Default, can omit
72
+ refreshEndpoint: '/auth/refresh' // Default, can omit
73
+ }
74
+ }
75
+ ```
76
+
77
+ **For legacy/custom backend users:**
78
+ ```typescript
79
+ // environment.ts
80
+ export const environment = {
81
+ apiServer: { host: 'http://localhost:8000/' },
82
+ auth: {
83
+ mode: 'body',
84
+ refreshEndpoint: '/user/refresh_access'
85
+ }
86
+ }
87
+ ```
88
+
89
+ **To disable auto-refresh:**
90
+ ```typescript
91
+ // environment.ts
92
+ export const environment = {
93
+ apiServer: { host: 'http://localhost:8000/' },
94
+ auth: { mode: 'none' }
95
+ }
96
+ ```
97
+
98
+ ### Fixed
99
+ - ✅ **Authentication compatibility with StoneScriptPHP v2.1.x** - Now fully compatible!
100
+ - ✅ Cookie-based auth with CSRF protection
101
+ - ✅ Configurable refresh endpoints
102
+ - ✅ Proper error handling in both auth modes
103
+
104
+ ### Documentation
105
+ - Updated [AUTH_COMPATIBILITY.md](AUTH_COMPATIBILITY.md) (in docs/) - Auth now fully compatible!
106
+ - Added configuration examples for all auth modes
107
+ - Comprehensive migration guide
108
+
109
+ ---
110
+
111
+ ## [0.0.13] - 2025-12-14 (Skipped - Never Published)
112
+
113
+ ### Added
114
+
115
+ #### ApiConnectionService
116
+ - **DELETE method**: Added `delete<T>(endpoint: string, queryParamsObj?: any): Promise<ApiResponse<T>>` for DELETE HTTP requests
117
+ - **PUT method**: Added `put<T>(pathWithQueryParams: string, data: any): Promise<ApiResponse<T>>` for PUT HTTP requests (full updates)
118
+ - **PATCH method**: Added `patch<T>(pathWithQueryParams: string, data: any): Promise<ApiResponse<T>>` for PATCH HTTP requests (partial updates)
119
+
120
+ #### ApiResponse Model
121
+ - **isSuccess()**: Returns `true` if status is 'ok'
122
+ - **isError()**: Returns `true` if status is 'error' or 'not ok'
123
+ - **getData()**: Returns the data payload or null
124
+ - **getError()**: Returns the error message or 'Unknown error'
125
+ - **getStatus()**: Returns the status string
126
+ - **getMessage()**: Returns the message string
127
+
128
+ ### Fixed
129
+ - Version synchronization between root package.json (0.0.12) and library package.json (was 0.0.10, now 0.0.12)
130
+
131
+ ### Notes
132
+ - `onOk()` and `onNotOk()` methods were already present in ApiResponse (since earlier versions)
133
+ - `DbService` is exported but remains unimplemented - placeholder for future database query functionality
134
+
135
+ ## [0.0.10] - 2025-12-08
136
+
137
+ ### Published to NPM
138
+ - Initial NPM release with GET and POST methods
139
+ - Basic authentication flow with token refresh
140
+ - ApiResponse model with `onOk()`, `onNotOk()`, and `onError()` callbacks
141
+
142
+ ## [0.0.9] - 2025-12-07
143
+
144
+ ### Changed
145
+ - Documentation improvements
146
+ - README updates for npm presentation
147
+
148
+ ## [0.0.8] - 2025-12-06
149
+
150
+ ### Changed
151
+ - Package naming fixes
152
+ - Documentation updates
153
+
154
+ ---
155
+
156
+ ## Migration Guide: v0.0.10 → v0.0.13
157
+
158
+ ### New HTTP Methods Available
159
+
160
+ You can now use all standard REST HTTP methods:
161
+
162
+ ```typescript
163
+ // Before (v0.0.10) - Had to use raw HttpClient for these operations
164
+ constructor(private http: HttpClient) {}
165
+ this.http.delete(`${apiUrl}/users/${id}`).subscribe(...)
166
+
167
+ // After (v0.0.13) - Use ApiConnectionService directly
168
+ constructor(private apiConnection: ApiConnectionService) {}
169
+
170
+ // DELETE
171
+ await this.apiConnection.delete(`/users/${id}`)
172
+ await this.apiConnection.delete(`/users/${id}`, { force: true }) // with query params
173
+
174
+ // PUT (full update)
175
+ await this.apiConnection.put(`/users/${id}`, { name: 'John', email: 'john@example.com' })
176
+
177
+ // PATCH (partial update)
178
+ await this.apiConnection.patch(`/users/${id}`, { name: 'John' })
179
+ ```
180
+
181
+ ### New ApiResponse Helper Methods
182
+
183
+ ```typescript
184
+ // Before (v0.0.10) - Manual status checking
185
+ const response = await this.apiConnection.get('/users')
186
+ if (response.status === 'ok') {
187
+ this.users = response.data
188
+ } else {
189
+ this.error = response.message
190
+ }
191
+
192
+ // After (v0.0.13) - Use helper methods
193
+ const response = await this.apiConnection.get('/users')
194
+
195
+ // Option 1: Helper methods
196
+ if (response.isSuccess()) {
197
+ this.users = response.getData()
198
+ } else {
199
+ this.error = response.getError()
200
+ }
201
+
202
+ // Option 2: Fluent API (still available)
203
+ response
204
+ .onOk(data => this.users = data)
205
+ .onNotOk((message, data) => this.error = message)
206
+ .onError(() => console.error('Network error'))
207
+ ```
208
+
209
+ ---
210
+
211
+ ## Known Issues
212
+
213
+ ### 🔴 CRITICAL: Authentication Flow Incompatibility
214
+
215
+ The token refresh mechanism in v0.0.13 is **incompatible** with StoneScriptPHP Framework v2.1.x built-in authentication.
216
+
217
+ **Issue**: Client expects `/user/refresh_access` endpoint with tokens in request body, but the framework's built-in `RefreshRoute` uses:
218
+ - Endpoint: `/auth/refresh` (default, customizable)
219
+ - Security: httpOnly cookies + CSRF tokens
220
+ - Does NOT accept tokens in request body
221
+
222
+ **Impact**:
223
+ - ✅ **Works**: General API calls (GET, POST, PUT, PATCH, DELETE) with manual token management
224
+ - ❌ **Broken**: Automatic token refresh on 401 errors
225
+ - ⚠️ **Workaround**: Implement custom `/user/refresh_access` route on your backend OR manage auth manually
226
+
227
+ **See**: [AUTH_COMPATIBILITY.md](AUTH_COMPATIBILITY.md) for detailed analysis and solutions.
228
+
229
+ **Fix Planned**: v0.0.14 will add configurable auth modes to support both cookie-based and body-based authentication.
230
+
231
+ ### DbService (Not Yet Implemented)
232
+ The `DbService` is exported in the public API but contains no implementation. It is a placeholder for future database query functionality. Do not use it in production.
233
+
234
+ ### Angular Version Compatibility
235
+ The package is built with Angular 16 but declares peer dependencies for Angular 16-20. While it should work across these versions, comprehensive testing has only been done with Angular 16. If you encounter issues with Angular 19/20, please report them at: https://github.com/progalaxyelabs/ngx-stonescriptphp-client/issues
236
+
237
+ ---
238
+
239
+ ## Roadmap
240
+
241
+ ### Planned for v0.0.13+
242
+ - Complete `DbService` implementation with type-safe database queries
243
+ - HTTP interceptor support for custom auth/logging/retry logic
244
+ - File upload/download support
245
+ - Comprehensive unit tests
246
+ - Rebuild with Angular 19/20 for production
247
+
248
+ ### Future Versions
249
+ - RxJS operators for common patterns
250
+ - WebSocket support for real-time features
251
+ - Migration to `@stonescriptphp` namespace
252
+ - Demo application and Storybook documentation
253
+
254
+ ---
255
+
256
+ ## Links
257
+
258
+ - **NPM Package**: https://www.npmjs.com/package/@progalaxyelabs/ngx-stonescriptphp-client
259
+ - **GitHub Repository**: https://github.com/progalaxyelabs/ngx-stonescriptphp-client
260
+ - **StoneScriptPHP Framework**: https://stonescriptphp.org
261
+ - **Report Issues**: https://github.com/progalaxyelabs/ngx-stonescriptphp-client/issues
package/package.json CHANGED
@@ -1,25 +1,82 @@
1
1
  {
2
2
  "name": "@progalaxyelabs/ngx-stonescriptphp-client",
3
- "version": "0.0.10",
3
+ "version": "1.0.4",
4
+ "description": "Angular client library for StoneScriptPHP backend framework",
5
+ "keywords": [
6
+ "angular",
7
+ "stonescriptphp",
8
+ "http-client",
9
+ "api-client",
10
+ "typescript"
11
+ ],
12
+ "homepage": "https://stonescriptphp.org",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/progalaxyelabs/ngx-stonescriptphp-client.git"
16
+ },
17
+ "bugs": {
18
+ "url": "https://github.com/progalaxyelabs/ngx-stonescriptphp-client/issues"
19
+ },
20
+ "license": "MIT",
21
+ "author": {
22
+ "name": "StoneScriptPHP Team",
23
+ "email": "team@stonescriptphp.org",
24
+ "url": "https://stonescriptphp.org"
25
+ },
26
+ "main": "dist/index.js",
27
+ "types": "dist/index.d.ts",
28
+ "files": [
29
+ "dist",
30
+ "README.md",
31
+ "HLD.md",
32
+ "LICENSE",
33
+ "docs"
34
+ ],
35
+ "scripts": {
36
+ "ng": "ng",
37
+ "start": "ng serve",
38
+ "prebuild": "npm --no-git-tag-version version patch",
39
+ "build": "ng build",
40
+ "watch": "ng build --watch --configuration development",
41
+ "test": "ng test",
42
+ "publish:npm": "npm publish --access public"
43
+ },
44
+ "private": false,
4
45
  "peerDependencies": {
5
- "@angular/common": "^16.2.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0",
6
- "@angular/core": "^16.2.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0"
46
+ "@angular/common": "^19.0.0 || ^20.0.0",
47
+ "@angular/core": "^19.0.0 || ^20.0.0",
48
+ "rxjs": "^7.8.0"
7
49
  },
8
50
  "dependencies": {
9
- "tslib": "^2.3.0"
51
+ "@angular-devkit/schematics": "^20.0.0",
52
+ "@angular/animations": "^20.0.0",
53
+ "@angular/common": "^20.0.0",
54
+ "@angular/compiler": "^20.0.0",
55
+ "@angular/core": "^20.0.0",
56
+ "@angular/forms": "^20.0.0",
57
+ "@angular/platform-browser": "^20.0.0",
58
+ "@angular/platform-browser-dynamic": "^20.0.0",
59
+ "@angular/router": "^20.0.0",
60
+ "rxjs": "~7.8.0",
61
+ "tslib": "^2.8.0",
62
+ "zone.js": "~0.15.0"
63
+ },
64
+ "devDependencies": {
65
+ "@angular-devkit/build-angular": "^20.0.0",
66
+ "@angular/cli": "^20.0.0",
67
+ "@angular/compiler-cli": "^20.0.0",
68
+ "@schematics/angular": "^20.0.0",
69
+ "@types/jasmine": "~5.1.0",
70
+ "jasmine-core": "~5.5.0",
71
+ "karma": "~6.4.0",
72
+ "karma-chrome-launcher": "~3.2.0",
73
+ "karma-coverage": "~2.2.0",
74
+ "karma-jasmine": "~5.1.0",
75
+ "karma-jasmine-html-reporter": "~2.1.0",
76
+ "ng-packagr": "^20.0.0",
77
+ "typescript": "~5.8.0"
10
78
  },
11
- "sideEffects": false,
12
- "module": "fesm2022/progalaxyelabs-ngx-stonescriptphp-client.mjs",
13
- "typings": "index.d.ts",
14
- "exports": {
15
- "./package.json": {
16
- "default": "./package.json"
17
- },
18
- ".": {
19
- "types": "./index.d.ts",
20
- "esm2022": "./esm2022/progalaxyelabs-ngx-stonescriptphp-client.mjs",
21
- "esm": "./esm2022/progalaxyelabs-ngx-stonescriptphp-client.mjs",
22
- "default": "./fesm2022/progalaxyelabs-ngx-stonescriptphp-client.mjs"
23
- }
79
+ "publishConfig": {
80
+ "access": "public"
24
81
  }
25
- }
82
+ }
@@ -1,169 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { ApiResponse } from './api-response.model';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "./token.service";
5
- import * as i2 from "./signin-status.service";
6
- import * as i3 from "./my-environment.model";
7
- export class ApiConnectionService {
8
- constructor(tokens, signinStatus, environment) {
9
- this.tokens = tokens;
10
- this.signinStatus = signinStatus;
11
- this.environment = environment;
12
- this.host = ''; // contains trailing slash
13
- this.accessToken = '';
14
- this.host = environment.apiServer.host;
15
- }
16
- async request(url, options, data) {
17
- try {
18
- if (data !== null) {
19
- const body = JSON.stringify(data);
20
- if (body) {
21
- options.body = body;
22
- }
23
- else {
24
- options.body = {};
25
- }
26
- }
27
- const accessTokenIncluded = this.includeAccessToken(options);
28
- let response = await fetch(url, options);
29
- if ((response.status === 401) && accessTokenIncluded) {
30
- response = await this.refreshAccessTokenAndRetry(url, options, response);
31
- }
32
- if (response.ok) {
33
- const json = await (response.json());
34
- return (new ApiResponse(json.status, json.data, json.message));
35
- }
36
- if (response.status === 401) {
37
- this.signinStatus.signedOut();
38
- }
39
- return this.handleError(response);
40
- }
41
- catch (error) {
42
- return this.handleError(error);
43
- }
44
- }
45
- handleError(error) {
46
- console.error(`Backend returned code ${error.status}, ` +
47
- `full error: `, error);
48
- return new ApiResponse('error');
49
- }
50
- async get(endpoint, queryParamsObj) {
51
- const url = this.host + endpoint.replace(/^\/+/, '') + this.buildQueryString(queryParamsObj);
52
- const fetchOptions = {
53
- mode: 'cors',
54
- redirect: 'error'
55
- };
56
- return this.request(url, fetchOptions, null);
57
- }
58
- async post(pathWithQueryParams, data) {
59
- const url = this.host + pathWithQueryParams.replace(/^\/+/, '');
60
- const fetchOptions = {
61
- method: 'POST',
62
- mode: 'cors',
63
- redirect: 'error',
64
- headers: {
65
- 'Content-Type': 'application/json'
66
- },
67
- body: JSON.stringify(data)
68
- };
69
- return this.request(url, fetchOptions, data);
70
- }
71
- // async postFormWithFiles(pathWithQueryParams: string, formData: FormData): Promise<ApiResponse | null> {
72
- // const url = this.host + pathWithQueryParams.replace(/^\/+/, '')
73
- // try {
74
- // const fetchOptions: RequestInit = {
75
- // method: 'POST',
76
- // mode: 'cors',
77
- // redirect: 'error',
78
- // body: formData
79
- // }
80
- // const accessTokenIncluded = this.includeAccessToken(fetchOptions)
81
- // let response: Response = await fetch(url, fetchOptions)
82
- // if ((response.status === 401) && accessTokenIncluded) {
83
- // response = await this.refreshAccessTokenAndRetry(url, fetchOptions, response)
84
- // }
85
- // if (response.ok) {
86
- // return ((await (response.json()) as ApiResponse))
87
- // }
88
- // return this.handleError(response)
89
- // } catch (error) {
90
- // return this.handleError(error)
91
- // }
92
- // }
93
- includeAccessToken(options) {
94
- this.accessToken = this.tokens.getAccessToken();
95
- if (!this.accessToken) {
96
- return false;
97
- }
98
- if (!options.headers) {
99
- options.headers = {};
100
- }
101
- options.headers['Authorization'] = 'Bearer ' + this.accessToken;
102
- return true;
103
- }
104
- async refreshAccessTokenAndRetry(url, fetchOptions, response) {
105
- const refreshStatusOk = await this.refreshAccessToken();
106
- if (!refreshStatusOk) {
107
- return response;
108
- }
109
- fetchOptions.headers['Authorization'] = 'Bearer ' + this.accessToken;
110
- response = await fetch(url, fetchOptions);
111
- return response;
112
- }
113
- async refreshAccessToken() {
114
- const refreshToken = this.tokens.getRefreshToken();
115
- if (!refreshToken) {
116
- return false;
117
- }
118
- const refreshTokenUrl = this.host + 'user/refresh_access';
119
- let refreshTokenResponse = await fetch(refreshTokenUrl, {
120
- method: 'POST',
121
- mode: 'cors',
122
- redirect: 'error',
123
- headers: {
124
- 'Content-Type': 'application/json'
125
- },
126
- body: JSON.stringify({
127
- access_token: this.accessToken,
128
- refresh_token: refreshToken
129
- })
130
- });
131
- if (!refreshTokenResponse.ok) {
132
- this.accessToken = '';
133
- this.tokens.clear();
134
- return false;
135
- }
136
- let refreshAccessData = await refreshTokenResponse.json();
137
- if (!refreshAccessData) {
138
- return false;
139
- }
140
- this.tokens.setTokens(refreshAccessData.data.access_token, refreshToken);
141
- this.accessToken = refreshAccessData.data.access_token;
142
- return true;
143
- }
144
- buildQueryString(options) {
145
- if (options === undefined) {
146
- return '';
147
- }
148
- const array = [];
149
- for (let key in options) {
150
- if (options.hasOwnProperty(key) && (options[key] !== null) && (options[key] !== undefined)) {
151
- array.push(encodeURIComponent(key) + "=" + encodeURIComponent(options[key]));
152
- }
153
- }
154
- const str = array.join('&');
155
- if (str !== '') {
156
- return '?' + str;
157
- }
158
- return '';
159
- }
160
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApiConnectionService, deps: [{ token: i1.TokenService }, { token: i2.SigninStatusService }, { token: i3.MyEnvironmentModel }], target: i0.ɵɵFactoryTarget.Injectable }); }
161
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApiConnectionService, providedIn: 'root' }); }
162
- }
163
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ApiConnectionService, decorators: [{
164
- type: Injectable,
165
- args: [{
166
- providedIn: 'root'
167
- }]
168
- }], ctorParameters: function () { return [{ type: i1.TokenService }, { type: i2.SigninStatusService }, { type: i3.MyEnvironmentModel }]; } });
169
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNvbm5lY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zdG9uZXNjcmlwdHBocC1jbGllbnQvc3JjL2xpYi9hcGktY29ubmVjdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7OztBQU1uRCxNQUFNLE9BQU8sb0JBQW9CO0lBTTdCLFlBQ1ksTUFBb0IsRUFDcEIsWUFBaUMsRUFDakMsV0FBK0I7UUFGL0IsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQUNwQixpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDakMsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBUG5DLFNBQUksR0FBRyxFQUFFLENBQUEsQ0FBQywwQkFBMEI7UUFFcEMsZ0JBQVcsR0FBRyxFQUFFLENBQUE7UUFPcEIsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQTtJQUMxQyxDQUFDO0lBR08sS0FBSyxDQUFDLE9BQU8sQ0FBVyxHQUFXLEVBQUUsT0FBWSxFQUFFLElBQWdCO1FBQ3ZFLElBQUk7WUFFQSxJQUFHLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQ2QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDakMsSUFBRyxJQUFJLEVBQUU7b0JBQ0wsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7aUJBQ3RCO3FCQUFNO29CQUNILE9BQU8sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFBO2lCQUNwQjthQUNKO1lBRUQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUE7WUFFNUQsSUFBSSxRQUFRLEdBQWEsTUFBTSxL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TyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTthQUMvRTtTQUNKO1FBQ0QsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMzQixJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUU7WUFDWixPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUE7U0FDbkI7UUFFRCxPQUFPLEVBQUUsQ0FBQTtJQUNiLENBQUM7K0dBekxRLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRmpCLE1BQU07OzRGQUVULG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgfSBmcm9tICcuL3Rva2VuLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2lnbmluU3RhdHVzU2VydmljZSB9IGZyb20gJy4vc2lnbmluLXN0YXR1cy5zZXJ2aWNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlIH0gZnJvbSAnLi9hcGktcmVzcG9uc2UubW9kZWwnO1xuaW1wb3J0IHsgTXlFbnZpcm9ubWVudE1vZGVsIH0gZnJvbSAnLi9teS1lbnZpcm9ubWVudC5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXBpQ29ubmVjdGlvblNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBob3N0ID0gJycgLy8gY29udGFpbnMgdHJhaWxpbmcgc2xhc2hcblxuICAgIHByaXZhdGUgYWNjZXNzVG9rZW4gPSAnJ1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgdG9rZW5zOiBUb2tlblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc2lnbmluU3RhdHVzOiBTaWduaW5TdGF0dXNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGVudmlyb25tZW50OiBNeUVudmlyb25tZW50TW9kZWxcbiAgICApIHtcbiAgICAgICAgdGhpcy5ob3N0ID0gZW52aXJvbm1lbnQuYXBpU2VydmVyLmhvc3RcbiAgICB9XG5cblxuICAgIHByaXZhdGUgYXN5bmMgcmVxdWVzdDxEYXRhVHlwZT4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IGFueSwgZGF0YTogYW55IHwgbnVsbCk6IFByb21pc2U8QXBpUmVzcG9uc2U8RGF0YVR5cGU+PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKGRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSlcbiAgICAgICAgICAgICAgICBpZihib2R5KSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IGJvZHlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmJvZHkgPSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW5JbmNsdWRlZCA9IHRoaXMuaW5jbHVkZUFjY2Vzc1Rva2VuKG9wdGlvbnMpXG5cbiAgICAgICAgICAgIGxldCByZXNwb25zZTogUmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIG9wdGlvbnMpXG5cbiAgICAgICAgICAgIGlmICgocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpICYmIGFjY2Vzc1Rva2VuSW5jbHVkZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuQW5kUmV0cnkodXJsLCBvcHRpb25zLCByZXNwb25zZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IChyZXNwb25zZS5qc29uKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgQXBpUmVzcG9uc2U8RGF0YVR5cGU+KGpzb24uc3RhdHVzLCBqc29uLmRhdGEsIGpzb24ubWVzc2FnZSkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmluU3RhdHVzLnNpZ25lZE91dCgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yPERhdGFUeXBlPihyZXNwb25zZSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yPERhdGFUeXBlPihlcnJvcilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlRXJyb3I8RGF0YVR5cGU+KGVycm9yOiBhbnkpOiBBcGlSZXNwb25zZTxEYXRhVHlwZT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEJhY2tlbmQgcmV0dXJuZWQgY29kZSAke2Vycm9yLnN0YXR1c30sIGAgK1xuICAgICAgICAgICAgYGZ1bGwgZXJyb3I6IGAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBcGlSZXNwb25zZTxEYXRhVHlwZT4oJ2Vycm9yJylcbiAgICB9XG5cbiAgICBhc3luYyBnZXQ8RGF0YVR5cGU+KGVuZHBvaW50OiBzdHJpbmcsIHF1ZXJ5UGFyYW1zT2JqPzogYW55ICk6IFByb21pc2U8QXBpUmVzcG9uc2U8RGF0YVR5cGU+PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuaG9zdCArIGVuZHBvaW50LnJlcGxhY2UoL15cXC8rLywgJycpICsgdGhpcy5idWlsZFF1ZXJ5U3RyaW5nKHF1ZXJ5UGFyYW1zT2JqKVxuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICAgICAgbW9kZTogJ2NvcnMnLFxuICAgICAgICAgICAgcmVkaXJlY3Q6ICdlcnJvcidcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHVybCwgZmV0Y2hPcHRpb25zLCBudWxsKVxuICAgIH1cblxuICAgIGFzeW5jIHBvc3Q8RGF0YVR5cGU+KHBhdGhXaXRoUXVlcnlQYXJhbXM6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTxBcGlSZXNwb25zZTxEYXRhVHlwZT4+IHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5ob3N0ICsgcGF0aFdpdGhRdWVyeVBhcmFtcy5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBtb2RlOiAnY29ycycsXG4gICAgICAgICAgICByZWRpcmVjdDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHVybCwgZmV0Y2hPcHRpb25zLCBkYXRhKSAgICAgICAgXG4gICAgfVxuXG4gICAgLy8gYXN5bmMgcG9zdEZvcm1XaXRoRmlsZXMocGF0aFdpdGhRdWVyeVBhcmFtczogc3RyaW5nLCBmb3JtRGF0YTogRm9ybURhdGEpOiBQcm9taXNlPEFwaVJlc3BvbnNlIHwgbnVsbD4ge1xuICAgIC8vICAgICBjb25zdCB1cmwgPSB0aGlzLmhvc3QgKyBwYXRoV2l0aFF1ZXJ5UGFyYW1zLnJlcGxhY2UoL15cXC8rLywgJycpXG4gICAgLy8gICAgIHRyeSB7XG4gICAgLy8gICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge1xuICAgIC8vICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIC8vICAgICAgICAgICAgIG1vZGU6ICdjb3JzJyxcbiAgICAvLyAgICAgICAgICAgICByZWRpcmVjdDogJ2Vycm9yJyxcbiAgICAvLyAgICAgICAgICAgICBib2R5OiBmb3JtRGF0YVxuICAgIC8vICAgICAgICAgfVxuXG4gICAgLy8gICAgICAgICBjb25zdCBhY2Nlc3NUb2tlbkluY2x1ZGVkID0gdGhpcy5pbmNsdWRlQWNjZXNzVG9rZW4oZmV0Y2hPcHRpb25zKVxuXG4gICAgLy8gICAgICAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBmZXRjaE9wdGlvbnMpXG5cbiAgICAvLyAgICAgICAgIGlmICgocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpICYmIGFjY2Vzc1Rva2VuSW5jbHVkZWQpIHtcbiAgICAvLyAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuQW5kUmV0cnkodXJsLCBmZXRjaE9wdGlvbnMsIHJlc3BvbnNlKVxuICAgIC8vICAgICAgICAgfVxuXG4gICAgLy8gICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gKChhd2FpdCAocmVzcG9uc2UuanNvbigpKSBhcyBBcGlSZXNwb25zZSkpXG4gICAgLy8gICAgICAgICB9XG5cbiAgICAvLyAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yKHJlc3BvbnNlKVxuICAgIC8vICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpXG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICBwcml2YXRlIGluY2x1ZGVBY2Nlc3NUb2tlbihvcHRpb25zOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IHRoaXMudG9rZW5zLmdldEFjY2Vzc1Rva2VuKClcbiAgICAgICAgaWYgKCF0aGlzLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSB7fVxuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gJ0JlYXJlciAnICsgdGhpcy5hY2Nlc3NUb2tlblxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVmcmVzaEFjY2Vzc1Rva2VuQW5kUmV0cnkodXJsOiBzdHJpbmcsIGZldGNoT3B0aW9uczogYW55LCByZXNwb25zZTogUmVzcG9uc2UpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG5cbiAgICAgICAgY29uc3QgcmVmcmVzaFN0YXR1c09rID0gYXdhaXQgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKVxuICAgICAgICBpZiAoIXJlZnJlc2hTdGF0dXNPaykge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlXG4gICAgICAgIH1cblxuICAgICAgICBmZXRjaE9wdGlvbnMuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gJ0JlYXJlciAnICsgdGhpcy5hY2Nlc3NUb2tlblxuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgZmV0Y2hPcHRpb25zKVxuICAgICAgICByZXR1cm4gcmVzcG9uc2VcbiAgICB9XG5cbiAgICBhc3luYyByZWZyZXNoQWNjZXNzVG9rZW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IHRoaXMudG9rZW5zLmdldFJlZnJlc2hUb2tlbigpXG4gICAgICAgIGlmICghcmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlblVybCA9IHRoaXMuaG9zdCArICd1c2VyL3JlZnJlc2hfYWNjZXNzJ1xuICAgICAgICBsZXQgcmVmcmVzaFRva2VuUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZWZyZXNoVG9rZW5VcmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgbW9kZTogJ2NvcnMnLFxuICAgICAgICAgICAgcmVkaXJlY3Q6ICdlcnJvcicsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBhY2Nlc3NfdG9rZW46IHRoaXMuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgICBpZiAoIXJlZnJlc2hUb2tlblJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gJydcbiAgICAgICAgICAgIHRoaXMudG9rZW5zLmNsZWFyKClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlZnJlc2hBY2Nlc3NEYXRhID0gYXdhaXQgcmVmcmVzaFRva2VuUmVzcG9uc2UuanNvbigpXG4gICAgICAgIGlmICghcmVmcmVzaEFjY2Vzc0RhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9rZW5zLnNldFRva2VucyhyZWZyZXNoQWNjZXNzRGF0YS5kYXRhLmFjY2Vzc190b2tlbiwgcmVmcmVzaFRva2VuKVxuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gcmVmcmVzaEFjY2Vzc0RhdGEuZGF0YS5hY2Nlc3NfdG9rZW5cblxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGJ1aWxkUXVlcnlTdHJpbmcob3B0aW9ucz86IGFueSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiAnJ1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJyYXkgPSBbXVxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAob3B0aW9uc1trZXldICE9PSBudWxsKSAmJiAob3B0aW9uc1trZXldICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgYXJyYXkucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG9wdGlvbnNba2V5XSkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RyID0gYXJyYXkuam9pbignJicpXG4gICAgICAgIGlmIChzdHIgIT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJz8nICsgc3RyXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJydcbiAgICB9XG59XG4iXX0=
@@ -1,26 +0,0 @@
1
- export class ApiResponse {
2
- constructor(status, data = {}, message = '') {
3
- this.status = status;
4
- this.data = data;
5
- this.message = message;
6
- }
7
- onOk(callback) {
8
- if (this.status === 'ok') {
9
- callback(this.data);
10
- }
11
- return this;
12
- }
13
- onNotOk(callback) {
14
- if (this.status === 'not ok') {
15
- callback(this.message, this.data);
16
- }
17
- return this;
18
- }
19
- onError(callback) {
20
- if (this.status === 'error') {
21
- callback();
22
- }
23
- return this;
24
- }
25
- }
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXJlc3BvbnNlLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN0b25lc2NyaXB0cGhwLWNsaWVudC9zcmMvbGliL2FwaS1yZXNwb25zZS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sV0FBVztJQUtwQixZQUFZLE1BQWMsRUFBRSxPQUFZLEVBQUUsRUFBRSxVQUFrQixFQUFFO1FBQzVELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO0lBQzFCLENBQUM7SUFFRCxJQUFJLENBQUMsUUFBa0M7UUFDbkMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtZQUN0QixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1NBQ3RCO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsT0FBTyxDQUFDLFFBQW1EO1FBQ3ZELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDMUIsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1NBQ3BDO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsT0FBTyxDQUFDLFFBQW9CO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxPQUFPLEVBQUU7WUFDekIsUUFBUSxFQUFFLENBQUE7U0FDYjtRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEFwaVJlc3BvbnNlPERhdGFUeXBlPiB7XG4gICAgcHJpdmF0ZSBzdGF0dXM6IHN0cmluZ1xuICAgIHByaXZhdGUgZGF0YTogYW55XG4gICAgcHJpdmF0ZSBtZXNzYWdlOiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkgPSB7fSwgbWVzc2FnZTogc3RyaW5nID0gJycpIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXNcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YVxuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlXG4gICAgfVxuXG4gICAgb25PayhjYWxsYmFjazogKGRhdGE6IERhdGFUeXBlKSA9PiB2b2lkKTogQXBpUmVzcG9uc2U8RGF0YVR5cGU+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAnb2snKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh0aGlzLmRhdGEpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBvbk5vdE9rKGNhbGxiYWNrOiAobWVzc2FnZTogc3RyaW5nLCBkYXRhOiBEYXRhVHlwZSkgPT4gdm9pZCk6IEFwaVJlc3BvbnNlPERhdGFUeXBlPiB7XG4gICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ25vdCBvaycpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHRoaXMubWVzc2FnZSwgdGhpcy5kYXRhKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgb25FcnJvcihjYWxsYmFjazogKCkgPT4gdm9pZCk6IEFwaVJlc3BvbnNlPERhdGFUeXBlPiB7XG4gICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxufSJdfQ==
@@ -1,14 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class AuthService {
4
- constructor() { }
5
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthService, providedIn: 'root' }); }
7
- }
8
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AuthService, decorators: [{
9
- type: Injectable,
10
- args: [{
11
- providedIn: 'root'
12
- }]
13
- }], ctorParameters: function () { return []; } });
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN0b25lc2NyaXB0cGhwLWNsaWVudC9zcmMvbGliL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8sV0FBVztJQUV0QixnQkFBZ0IsQ0FBQzsrR0FGTixXQUFXO21IQUFYLFdBQVcsY0FGVixNQUFNOzs0RkFFUCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG59XG4iXX0=
@@ -1,14 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class DbService {
4
- constructor() { }
5
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbService, providedIn: 'root' }); }
7
- }
8
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbService, decorators: [{
9
- type: Injectable,
10
- args: [{
11
- providedIn: 'root'
12
- }]
13
- }], ctorParameters: function () { return []; } });
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zdG9uZXNjcmlwdHBocC1jbGllbnQvc3JjL2xpYi9kYi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDLE1BQU0sT0FBTyxTQUFTO0lBRXBCLGdCQUFnQixDQUFDOytHQUZOLFNBQVM7bUhBQVQsU0FBUyxjQUZSLE1BQU07OzRGQUVQLFNBQVM7a0JBSHJCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEYlNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG59XG4iXX0=
@@ -1,19 +0,0 @@
1
- export class MyEnvironmentModel {
2
- constructor() {
3
- this.production = true;
4
- this.firebase = {
5
- projectId: '',
6
- appId: '',
7
- databaseURL: '',
8
- storageBucket: '',
9
- locationId: '',
10
- apiKey: '',
11
- authDomain: '',
12
- messagingSenderId: '',
13
- measurementId: ''
14
- };
15
- this.apiServer = { host: '' };
16
- this.chatServer = { host: '' };
17
- }
18
- }
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXktZW52aXJvbm1lbnQubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3RvbmVzY3JpcHRwaHAtY2xpZW50L3NyYy9saWIvbXktZW52aXJvbm1lbnQubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLGtCQUFrQjtJQUEvQjtRQUNJLGVBQVUsR0FBWSxJQUFJLENBQUE7UUFDMUIsYUFBUSxHQVVKO1lBQ0ksU0FBUyxFQUFFLEVBQUU7WUFDYixLQUFLLEVBQUUsRUFBRTtZQUNULFdBQVcsRUFBRSxFQUFFO1lBQ2YsYUFBYSxFQUFFLEVBQUU7WUFDakIsVUFBVSxFQUFFLEVBQUU7WUFDZCxNQUFNLEVBQUUsRUFBRTtZQUNWLFVBQVUsRUFBRSxFQUFFO1lBQ2QsaUJBQWlCLEVBQUUsRUFBRTtZQUNyQixhQUFhLEVBQUUsRUFBRTtTQUNwQixDQUFBO1FBQ0wsY0FBUyxHQUVMLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFBO1FBQ2hCLGVBQVUsR0FFTixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNyQixDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgTXlFbnZpcm9ubWVudE1vZGVsIHtcbiAgICBwcm9kdWN0aW9uOiBib29sZWFuID0gdHJ1ZVxuICAgIGZpcmViYXNlOiB7XG4gICAgICAgIHByb2plY3RJZDogc3RyaW5nXG4gICAgICAgIGFwcElkOiBzdHJpbmdcbiAgICAgICAgZGF0YWJhc2VVUkw6IHN0cmluZ1xuICAgICAgICBzdG9yYWdlQnVja2V0OiBzdHJpbmdcbiAgICAgICAgbG9jYXRpb25JZDogc3RyaW5nXG4gICAgICAgIGFwaUtleTogc3RyaW5nXG4gICAgICAgIGF1dGhEb21haW46IHN0cmluZ1xuICAgICAgICBtZXNzYWdpbmdTZW5kZXJJZDogc3RyaW5nXG4gICAgICAgIG1lYXN1cmVtZW50SWQ6IHN0cmluZ1xuICAgIH0gPSB7XG4gICAgICAgICAgICBwcm9qZWN0SWQ6ICcnLFxuICAgICAgICAgICAgYXBwSWQ6ICcnLFxuICAgICAgICAgICAgZGF0YWJhc2VVUkw6ICcnLFxuICAgICAgICAgICAgc3RvcmFnZUJ1Y2tldDogJycsXG4gICAgICAgICAgICBsb2NhdGlvbklkOiAnJyxcbiAgICAgICAgICAgIGFwaUtleTogJycsXG4gICAgICAgICAgICBhdXRoRG9tYWluOiAnJyxcbiAgICAgICAgICAgIG1lc3NhZ2luZ1NlbmRlcklkOiAnJyxcbiAgICAgICAgICAgIG1lYXN1cmVtZW50SWQ6ICcnXG4gICAgICAgIH1cbiAgICBhcGlTZXJ2ZXI6IHtcbiAgICAgICAgaG9zdDogc3RyaW5nXG4gICAgfSA9IHsgaG9zdDogJycgfVxuICAgIGNoYXRTZXJ2ZXI6IHtcbiAgICAgICAgaG9zdDogc3RyaW5nXG4gICAgfSA9IHsgaG9zdDogJycgfTtcbn0iXX0=