@hichchi/ngx-utils 0.0.1-alpha.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/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # ngx-utils
2
+
3
+ This library was generated with [Nx](https://nx.dev).
4
+
5
+ ## Running unit tests
6
+
7
+ Run `nx test ngx-utils` to execute the unit tests.
@@ -0,0 +1,205 @@
1
+ import { take, map, tap, catchError, EMPTY, ReplaySubject, throwError, switchMap, filter } from 'rxjs';
2
+ import { AuthEndpoint, AuthErrorResponseCode } from '@hichchi/nest-connector/auth';
3
+ import { Endpoint, HttpClientErrorStatus } from '@hichchi/nest-connector';
4
+ import * as i0 from '@angular/core';
5
+ import { inject, Injectable, computed } from '@angular/core';
6
+ import { Router } from '@angular/router';
7
+ import { signalStore, withState, withComputed, withMethods, patchState } from '@ngrx/signals';
8
+ import { withStorageSync } from '@angular-architects/ngrx-toolkit';
9
+ import { HttpClient } from '@angular/common/http';
10
+
11
+ // noinspection JSUnusedGlobalSymbols
12
+ function apiUrlInterceptor(apiBase) {
13
+ return (req, next) => {
14
+ if (req.url.startsWith(apiBase) || req.url.startsWith("http")) {
15
+ return next(req);
16
+ }
17
+ const apiReq = req.clone({ url: `${apiBase}/${req.url}` });
18
+ return next(apiReq);
19
+ };
20
+ }
21
+
22
+ // noinspection JSUnusedGlobalSymbols
23
+ class AuthService {
24
+ http = inject(HttpClient);
25
+ signIn(dto) {
26
+ return this.http.post(`${Endpoint.AUTH}/${AuthEndpoint.SIGN_IN}`, dto).pipe(take(1), map(res => ({
27
+ ...res,
28
+ accessTokenExpiresOn: new Date(res.accessTokenExpiresOn),
29
+ refreshTokenExpiresOn: new Date(res.accessTokenExpiresOn),
30
+ })));
31
+ }
32
+ authenticateSocial(accessToken) {
33
+ return this.http
34
+ .post(`${Endpoint.AUTH}/${AuthEndpoint.AUTHENTICATE_SOCIAL}`, {
35
+ accessToken,
36
+ })
37
+ .pipe(take(1), map(res => ({
38
+ ...res,
39
+ accessTokenExpiresOn: new Date(res.accessTokenExpiresOn),
40
+ refreshTokenExpiresOn: new Date(res.accessTokenExpiresOn),
41
+ })));
42
+ }
43
+ signUp(dto) {
44
+ return this.http.post(`${Endpoint.AUTH}/${AuthEndpoint.SIGN_UP}`, dto).pipe(take(1));
45
+ }
46
+ refreshToken(refreshToken) {
47
+ return this.http
48
+ .post(`${Endpoint.AUTH}/${AuthEndpoint.REFRESH_TOKEN}`, {
49
+ refreshToken,
50
+ })
51
+ .pipe(take(1));
52
+ }
53
+ signOut() {
54
+ // this.app.startSpinner();
55
+ return this.http.post(`${Endpoint.AUTH}/${AuthEndpoint.SIGN_OUT}`, {}).pipe(take(1));
56
+ }
57
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: AuthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
58
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: AuthService, providedIn: "root" });
59
+ }
60
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: AuthService, decorators: [{
61
+ type: Injectable,
62
+ args: [{
63
+ providedIn: "root",
64
+ }]
65
+ }] });
66
+
67
+ /* eslint-disable */
68
+ // noinspection JSUnusedGlobalSymbols
69
+ const initialState = {
70
+ signedIn: false,
71
+ sessionId: null,
72
+ user: null,
73
+ accessToken: null,
74
+ refreshToken: null,
75
+ accessTokenExpiresOn: null,
76
+ refreshTokenExpiresOn: null,
77
+ };
78
+ const AuthState = signalStore({ providedIn: "root" }, withState(initialState), withStorageSync({ key: "auth" }), withComputed(({ accessToken, user }) => ({
79
+ hasAccessToken: computed(() => Boolean(accessToken())),
80
+ role: computed(() => user()?.role),
81
+ emailVerified: computed(() => Boolean(user()?.emailVerified)),
82
+ })), withMethods((store, router = inject(Router), authService = inject(AuthService)) => ({
83
+ reset() {
84
+ patchState(store, initialState);
85
+ },
86
+ setTokens(tokenResponse) {
87
+ const { accessToken, refreshToken, accessTokenExpiresOn, refreshTokenExpiresOn } = tokenResponse;
88
+ patchState(store, state => ({
89
+ ...state,
90
+ accessToken,
91
+ refreshToken,
92
+ accessTokenExpiresOn,
93
+ refreshTokenExpiresOn,
94
+ }));
95
+ },
96
+ signIn(signInBody, redirect) {
97
+ return authService.signIn(signInBody).pipe(tap((res) => {
98
+ patchState(store, { ...res, signedIn: true });
99
+ void router.navigateByUrl(typeof redirect === "string" ? redirect : redirect(res));
100
+ }));
101
+ },
102
+ authenticateSocial: (accessToken, redirect) => {
103
+ return authService.authenticateSocial(accessToken).pipe(tap((res) => {
104
+ patchState(store, { ...res, signedIn: Boolean(res.user.role) });
105
+ void router.navigateByUrl(typeof redirect === "string" ? redirect : redirect(res));
106
+ }), catchError(() => EMPTY));
107
+ },
108
+ signOut: (redirect) => {
109
+ return authService.signOut().pipe(tap({
110
+ next: () => {
111
+ patchState(store, initialState);
112
+ void router.navigateByUrl(redirect);
113
+ },
114
+ }), catchError(() => EMPTY));
115
+ },
116
+ })));
117
+
118
+ const SKIPPED_ERRORS = [
119
+ AuthErrorResponseCode.AUTH_401_EXPIRED_TOKEN,
120
+ AuthErrorResponseCode.AUTH_401_INVALID_TOKEN,
121
+ AuthErrorResponseCode.AUTH_401_NOT_LOGGED_IN,
122
+ ];
123
+ let refreshingInProgress = false;
124
+ const isRefreshTokenReq = (req) => req.url.includes(`${Endpoint.AUTH}/${AuthEndpoint.REFRESH_TOKEN}`);
125
+ let tokenSubject = new ReplaySubject(1);
126
+ function authInterceptor(redirect, onRedirect) {
127
+ return (req, next) => {
128
+ const authState = inject(AuthState);
129
+ const authService = inject(AuthService);
130
+ const router = inject(Router);
131
+ const setAccessToken = (req, accessToken) => {
132
+ return req.clone({
133
+ headers: req.headers.set("Authorization", "Bearer " + accessToken),
134
+ });
135
+ };
136
+ const gotoSignIn = () => {
137
+ onRedirect?.();
138
+ authState.reset();
139
+ // eslint-disable-next-line no-void
140
+ void router.navigateByUrl(redirect);
141
+ };
142
+ const refreshToken = (req, next) => {
143
+ if (!refreshingInProgress) {
144
+ refreshingInProgress = true;
145
+ tokenSubject.next(null);
146
+ const refreshToken = authState.refreshToken();
147
+ if (!refreshToken) {
148
+ refreshingInProgress = false;
149
+ gotoSignIn();
150
+ return throwError(() => new Error("Refresh token not found."));
151
+ }
152
+ return authService.refreshToken(refreshToken).pipe(switchMap((tokenResponse) => {
153
+ authState.setTokens(tokenResponse);
154
+ tokenSubject.next(tokenResponse.accessToken);
155
+ tokenSubject.complete();
156
+ tokenSubject = new ReplaySubject(1);
157
+ refreshingInProgress = false;
158
+ return next(setAccessToken(req, tokenResponse.accessToken));
159
+ }), catchError((error) => {
160
+ refreshingInProgress = false;
161
+ tokenSubject.error(error);
162
+ tokenSubject.complete();
163
+ tokenSubject = new ReplaySubject(1);
164
+ gotoSignIn();
165
+ return throwError(() => error);
166
+ }));
167
+ }
168
+ return tokenSubject.pipe(filter(result => result !== null), take(1), switchMap(token => {
169
+ return next(setAccessToken(req, token));
170
+ }));
171
+ };
172
+ const handleRequest = (req, next) => {
173
+ return next(req).pipe(catchError((error) => {
174
+ if (error.status === HttpClientErrorStatus.UNAUTHORIZED &&
175
+ error.error?.code &&
176
+ SKIPPED_ERRORS.includes(error.error?.code) &&
177
+ !isRefreshTokenReq(req)) {
178
+ if (authState.signedIn()) {
179
+ return refreshToken(req, next);
180
+ }
181
+ }
182
+ return throwError(() => error);
183
+ }));
184
+ };
185
+ if (authState.accessToken()) {
186
+ const tokenizedRequest = req.clone({
187
+ headers: req.headers.set("Authorization", "Bearer " + authState.accessToken()),
188
+ });
189
+ return handleRequest(tokenizedRequest, next);
190
+ }
191
+ return handleRequest(req, next);
192
+ };
193
+ }
194
+
195
+ // noinspection JSUnusedGlobalSymbols
196
+ function utils() {
197
+ return "Hello World";
198
+ }
199
+
200
+ /**
201
+ * Generated bundle index. Do not edit.
202
+ */
203
+
204
+ export { AuthService, AuthState, SKIPPED_ERRORS, apiUrlInterceptor, authInterceptor, utils };
205
+ //# sourceMappingURL=hichchi-ngx-utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hichchi-ngx-utils.mjs","sources":["../../../../libs/ngx-utils/src/lib/interceptors/api-url-interceptor.ts","../../../../libs/ngx-utils/src/lib/services/auth.service.ts","../../../../libs/ngx-utils/src/lib/state/auth.state.ts","../../../../libs/ngx-utils/src/lib/interceptors/auth.interceptor.ts","../../../../libs/ngx-utils/src/lib/utils/form.utils.ts","../../../../libs/ngx-utils/src/hichchi-ngx-utils.ts"],"sourcesContent":["// noinspection JSUnusedGlobalSymbols\n\nimport { HttpEvent, HttpHandlerFn, HttpInterceptorFn, HttpRequest } from \"@angular/common/http\";\nimport { Observable } from \"rxjs\";\n\nexport function apiUrlInterceptor(apiBase: string): HttpInterceptorFn {\n return (req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> => {\n if (req.url.startsWith(apiBase) || req.url.startsWith(\"http\")) {\n return next(req);\n }\n\n const apiReq = req.clone({ url: `${apiBase}/${req.url}` });\n\n return next(apiReq);\n };\n}\n","// noinspection JSUnusedGlobalSymbols\n\nimport { HttpClient } from \"@angular/common/http\";\nimport { inject, Injectable } from \"@angular/core\";\nimport { map, Observable, take } from \"rxjs\";\nimport {\n AccessToken,\n AuthEndpoint,\n AuthResponse,\n RefreshToken,\n SignInBody,\n SignUpBody,\n TokenResponse,\n User,\n} from \"@hichchi/nest-connector/auth\";\nimport { Endpoint, SuccessResponse } from \"@hichchi/nest-connector\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class AuthService {\n http = inject(HttpClient);\n\n signIn(dto: SignInBody): Observable<AuthResponse> {\n return this.http.post<AuthResponse>(`${Endpoint.AUTH}/${AuthEndpoint.SIGN_IN}`, dto).pipe(\n take(1),\n map(res => ({\n ...res,\n accessTokenExpiresOn: new Date(res.accessTokenExpiresOn),\n refreshTokenExpiresOn: new Date(res.accessTokenExpiresOn),\n })),\n );\n }\n\n authenticateSocial(accessToken: AccessToken): Observable<AuthResponse> {\n return this.http\n .post<AuthResponse>(`${Endpoint.AUTH}/${AuthEndpoint.AUTHENTICATE_SOCIAL}`, {\n accessToken,\n })\n .pipe(\n take(1),\n map(res => ({\n ...res,\n accessTokenExpiresOn: new Date(res.accessTokenExpiresOn),\n refreshTokenExpiresOn: new Date(res.accessTokenExpiresOn),\n })),\n );\n }\n\n signUp(dto: SignUpBody): Observable<User> {\n return this.http.post<User>(`${Endpoint.AUTH}/${AuthEndpoint.SIGN_UP}`, dto).pipe(take(1));\n }\n\n refreshToken(refreshToken: RefreshToken): Observable<TokenResponse> {\n return this.http\n .post<AuthResponse>(`${Endpoint.AUTH}/${AuthEndpoint.REFRESH_TOKEN}`, {\n refreshToken,\n })\n .pipe(take(1));\n }\n\n signOut(): Observable<SuccessResponse | null> {\n // this.app.startSpinner();\n return this.http.post<SuccessResponse>(`${Endpoint.AUTH}/${AuthEndpoint.SIGN_OUT}`, {}).pipe(take(1));\n }\n}\n","/* eslint-disable */\n// noinspection JSUnusedGlobalSymbols\n\nimport { computed, inject } from \"@angular/core\";\nimport { patchState, signalStore, withComputed, withMethods, withState } from \"@ngrx/signals\";\nimport { withStorageSync } from \"@angular-architects/ngrx-toolkit\";\nimport { catchError, EMPTY, Observable, tap } from \"rxjs\";\nimport { AccessToken, AuthResponse, RefreshToken, SignInBody, TokenResponse, User } from \"@hichchi/nest-connector/auth\";\nimport { SuccessResponse } from \"@hichchi/nest-connector\";\nimport { AuthService } from \"../services\";\nimport { Router } from \"@angular/router\";\n\nexport interface AuthStateModel {\n signedIn: boolean;\n sessionId: string | null;\n user: User | null;\n accessToken: AccessToken | null;\n refreshToken: RefreshToken | null;\n accessTokenExpiresOn: Date | null;\n refreshTokenExpiresOn: Date | null;\n}\n\nconst initialState: AuthStateModel = {\n signedIn: false,\n sessionId: null,\n user: null,\n accessToken: null,\n refreshToken: null,\n accessTokenExpiresOn: null,\n refreshTokenExpiresOn: null,\n};\n\nexport const AuthState = signalStore(\n { providedIn: \"root\" },\n withState<AuthStateModel>(initialState),\n withStorageSync({ key: \"auth\" }),\n withComputed(({ accessToken, user }) => ({\n hasAccessToken: computed(() => Boolean(accessToken())),\n role: computed(() => user()?.role),\n emailVerified: computed((): boolean => Boolean(user()?.emailVerified)),\n })),\n withMethods((store, router = inject(Router), authService = inject(AuthService)) => ({\n reset(): void {\n patchState(store, initialState);\n },\n setTokens(tokenResponse: TokenResponse): void {\n const { accessToken, refreshToken, accessTokenExpiresOn, refreshTokenExpiresOn } = tokenResponse;\n patchState(store, state => ({\n ...state,\n accessToken,\n refreshToken,\n accessTokenExpiresOn,\n refreshTokenExpiresOn,\n }));\n },\n signIn(signInBody: SignInBody, redirect: string | ((res: AuthResponse) => string)): Observable<AuthResponse> {\n return authService.signIn(signInBody).pipe(\n tap((res: AuthResponse): void => {\n patchState(store, { ...res, signedIn: true });\n void router.navigateByUrl(typeof redirect === \"string\" ? redirect: redirect(res));\n }),\n );\n },\n authenticateSocial: (\n accessToken: AccessToken,\n redirect: string | ((res: AuthResponse) => string),\n ): Observable<AuthResponse> => {\n return authService.authenticateSocial(accessToken).pipe(\n tap((res: AuthResponse): void => {\n patchState(store, { ...res, signedIn: Boolean(res.user.role) });\n void router.navigateByUrl(typeof redirect === \"string\" ? redirect: redirect(res));\n }),\n catchError(() => EMPTY),\n );\n },\n signOut: (redirect: string): Observable<SuccessResponse | null> => {\n return authService.signOut().pipe(\n tap({\n next: (): void => {\n patchState(store, initialState);\n void router.navigateByUrl(redirect);\n },\n }),\n catchError(() => EMPTY),\n );\n },\n })),\n);\n","import { HttpEvent, HttpHandlerFn, HttpInterceptorFn, HttpRequest } from \"@angular/common/http\";\nimport { catchError, filter, Observable, ReplaySubject, switchMap, take, throwError } from \"rxjs\";\nimport { AccessToken, AuthEndpoint, AuthErrorResponseCode, TokenResponse } from \"@hichchi/nest-connector/auth\";\nimport { Endpoint, ErrorResponseCode, HttpClientErrorStatus } from \"@hichchi/nest-connector\";\nimport { inject } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\nimport { HttpError } from \"../interfaces\";\nimport { AuthState } from \"../state\";\nimport { AuthService } from \"../services\";\n\nexport const SKIPPED_ERRORS: ErrorResponseCode[] = [\n AuthErrorResponseCode.AUTH_401_EXPIRED_TOKEN,\n AuthErrorResponseCode.AUTH_401_INVALID_TOKEN,\n AuthErrorResponseCode.AUTH_401_NOT_LOGGED_IN,\n];\n\nlet refreshingInProgress = false;\n\nconst isRefreshTokenReq = (req: HttpRequest<unknown>): boolean =>\n req.url.includes(`${Endpoint.AUTH}/${AuthEndpoint.REFRESH_TOKEN}`);\n\nlet tokenSubject: ReplaySubject<AccessToken | null> = new ReplaySubject<AccessToken | null>(1);\n\nexport function authInterceptor(redirect: string, onRedirect?: () => void): HttpInterceptorFn {\n return (req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> => {\n const authState = inject(AuthState);\n const authService = inject(AuthService);\n const router = inject(Router);\n\n const setAccessToken = (req: HttpRequest<unknown>, accessToken: AccessToken): HttpRequest<unknown> => {\n return req.clone({\n headers: req.headers.set(\"Authorization\", \"Bearer \" + accessToken),\n });\n };\n\n const gotoSignIn = (): void => {\n onRedirect?.();\n authState.reset();\n // eslint-disable-next-line no-void\n void router.navigateByUrl(redirect);\n };\n\n const refreshToken = (req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> => {\n if (!refreshingInProgress) {\n refreshingInProgress = true;\n tokenSubject.next(null);\n\n const refreshToken = authState.refreshToken();\n\n if (!refreshToken) {\n refreshingInProgress = false;\n gotoSignIn();\n return throwError(() => new Error(\"Refresh token not found.\"));\n }\n\n return authService.refreshToken(refreshToken).pipe(\n switchMap((tokenResponse: TokenResponse) => {\n authState.setTokens(tokenResponse);\n tokenSubject.next(tokenResponse.accessToken);\n tokenSubject.complete();\n tokenSubject = new ReplaySubject<AccessToken | null>(1);\n refreshingInProgress = false;\n return next(setAccessToken(req, tokenResponse.accessToken));\n }),\n catchError((error: HttpError) => {\n refreshingInProgress = false;\n tokenSubject.error(error);\n tokenSubject.complete();\n tokenSubject = new ReplaySubject<AccessToken | null>(1);\n gotoSignIn();\n return throwError(() => error);\n }),\n );\n }\n\n return tokenSubject.pipe(\n filter(result => result !== null),\n take(1),\n switchMap(token => {\n return next(setAccessToken(req, token));\n }),\n );\n };\n\n const handleRequest = (req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> => {\n return next(req).pipe(\n catchError((error: HttpError) => {\n if (\n error.status === HttpClientErrorStatus.UNAUTHORIZED &&\n error.error?.code &&\n SKIPPED_ERRORS.includes(error.error?.code) &&\n !isRefreshTokenReq(req)\n ) {\n if (authState.signedIn()) {\n return refreshToken(req, next);\n }\n }\n return throwError(() => error);\n }),\n );\n };\n\n if (authState.accessToken()) {\n const tokenizedRequest = req.clone({\n headers: req.headers.set(\"Authorization\", \"Bearer \" + authState.accessToken()),\n });\n return handleRequest(tokenizedRequest, next);\n }\n return handleRequest(req, next);\n };\n}\n","// noinspection JSUnusedGlobalSymbols\n\nexport function utils(): string {\n return \"Hello World\";\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from "./lib/interceptors";
2
+ export * from "./lib/interfaces";
3
+ export * from "./lib/services";
4
+ export * from "./lib/state";
5
+ export * from "./lib/utils";
@@ -0,0 +1,2 @@
1
+ import { HttpInterceptorFn } from "@angular/common/http";
2
+ export declare function apiUrlInterceptor(apiBase: string): HttpInterceptorFn;
@@ -0,0 +1,4 @@
1
+ import { HttpInterceptorFn } from "@angular/common/http";
2
+ import { ErrorResponseCode } from "@hichchi/nest-connector";
3
+ export declare const SKIPPED_ERRORS: ErrorResponseCode[];
4
+ export declare function authInterceptor(redirect: string, onRedirect?: () => void): HttpInterceptorFn;
@@ -0,0 +1,2 @@
1
+ export * from "./api-url-interceptor";
2
+ export * from "./auth.interceptor";
@@ -0,0 +1,6 @@
1
+ import { ErrorResponse } from "@hichchi/nest-connector";
2
+ export interface HttpError {
3
+ status: number;
4
+ message: string;
5
+ error?: ErrorResponse;
6
+ }
@@ -0,0 +1 @@
1
+ export * from "./http-error.interface";
@@ -0,0 +1,15 @@
1
+ import { HttpClient } from "@angular/common/http";
2
+ import { Observable } from "rxjs";
3
+ import { AccessToken, AuthResponse, RefreshToken, SignInBody, SignUpBody, TokenResponse, User } from "@hichchi/nest-connector/auth";
4
+ import { SuccessResponse } from "@hichchi/nest-connector";
5
+ import * as i0 from "@angular/core";
6
+ export declare class AuthService {
7
+ http: HttpClient;
8
+ signIn(dto: SignInBody): Observable<AuthResponse>;
9
+ authenticateSocial(accessToken: AccessToken): Observable<AuthResponse>;
10
+ signUp(dto: SignUpBody): Observable<User>;
11
+ refreshToken(refreshToken: RefreshToken): Observable<TokenResponse>;
12
+ signOut(): Observable<SuccessResponse | null>;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<AuthService, never>;
14
+ static ɵprov: i0.ɵɵInjectableDeclaration<AuthService>;
15
+ }
@@ -0,0 +1 @@
1
+ export * from "./auth.service";
@@ -0,0 +1,40 @@
1
+ import { Observable } from "rxjs";
2
+ import { AccessToken, AuthResponse, RefreshToken, SignInBody, TokenResponse, User } from "@hichchi/nest-connector/auth";
3
+ import { SuccessResponse } from "@hichchi/nest-connector";
4
+ export interface AuthStateModel {
5
+ signedIn: boolean;
6
+ sessionId: string | null;
7
+ user: User | null;
8
+ accessToken: AccessToken | null;
9
+ refreshToken: RefreshToken | null;
10
+ accessTokenExpiresOn: Date | null;
11
+ refreshTokenExpiresOn: Date | null;
12
+ }
13
+ export declare const AuthState: import("@angular/core").Type<{
14
+ signedIn: import("@angular/core").Signal<boolean>;
15
+ sessionId: import("@angular/core").Signal<string | null>;
16
+ user: import("@angular/core").Signal<User | null>;
17
+ accessToken: import("@angular/core").Signal<AccessToken | null>;
18
+ refreshToken: import("@angular/core").Signal<RefreshToken | null>;
19
+ accessTokenExpiresOn: import("@angular/core").Signal<Date | null>;
20
+ refreshTokenExpiresOn: import("@angular/core").Signal<Date | null>;
21
+ hasAccessToken: import("@angular/core").Signal<boolean>;
22
+ role: import("@angular/core").Signal<string | import("@hichchi/nest-connector/auth").Role | undefined>;
23
+ emailVerified: import("@angular/core").Signal<boolean>;
24
+ clearStorage: () => void;
25
+ readFromStorage: () => void;
26
+ writeToStorage: () => void;
27
+ reset: () => void;
28
+ setTokens: (tokenResponse: TokenResponse) => void;
29
+ signIn: (signInBody: SignInBody, redirect: string | ((res: AuthResponse) => string)) => Observable<AuthResponse>;
30
+ authenticateSocial: (accessToken: AccessToken, redirect: string | ((res: AuthResponse) => string)) => Observable<AuthResponse>;
31
+ signOut: (redirect: string) => Observable<SuccessResponse | null>;
32
+ } & import("@ngrx/signals").StateSource<{
33
+ signedIn: boolean;
34
+ sessionId: string | null;
35
+ user: User | null;
36
+ accessToken: AccessToken | null;
37
+ refreshToken: RefreshToken | null;
38
+ accessTokenExpiresOn: Date | null;
39
+ refreshTokenExpiresOn: Date | null;
40
+ }>>;
@@ -0,0 +1 @@
1
+ export * from "./auth.state";
@@ -0,0 +1 @@
1
+ export declare function utils(): string;
@@ -0,0 +1 @@
1
+ export * from "./form.utils";
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@hichchi/ngx-utils",
3
+ "version": "0.0.1-alpha.0",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/hichchidev/hichchi.git"
10
+ },
11
+ "keywords": [],
12
+ "author": "Waruna Udayanga",
13
+ "license": "MIT",
14
+ "sideEffects": false,
15
+ "peerDependencies": {
16
+ "@angular/common": "^19.0.0",
17
+ "@angular/core": "^19.0.0"
18
+ },
19
+ "module": "fesm2022/hichchi-ngx-utils.mjs",
20
+ "typings": "index.d.ts",
21
+ "exports": {
22
+ "./package.json": {
23
+ "default": "./package.json"
24
+ },
25
+ ".": {
26
+ "types": "./index.d.ts",
27
+ "default": "./fesm2022/hichchi-ngx-utils.mjs"
28
+ }
29
+ },
30
+ "dependencies": {
31
+ "tslib": "^2.3.0"
32
+ }
33
+ }