@nauth-toolkit/client-angular 0.1.59 → 0.1.60

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.
@@ -1,127 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { HttpErrorResponse } from '@angular/common/http';
3
- import { firstValueFrom } from 'rxjs';
4
- import { NAuthClientError, NAuthErrorCode } from '@nauth-toolkit/client';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common/http";
7
- /**
8
- * HTTP adapter for Angular using HttpClient.
9
- *
10
- * This adapter:
11
- * - Uses Angular's HttpClient for all requests
12
- * - Works with Angular's HTTP interceptors (including authInterceptor)
13
- * - Auto-provided via Angular DI (providedIn: 'root')
14
- * - Converts HttpClient responses to HttpResponse format
15
- * - Converts HttpErrorResponse to NAuthClientError
16
- *
17
- * Users don't need to configure this manually - it's automatically
18
- * injected when using AuthService in Angular apps.
19
- *
20
- * @example
21
- * ```typescript
22
- * // Automatic usage (no manual setup needed)
23
- * // AuthService automatically injects AngularHttpAdapter
24
- * constructor(private auth: AuthService) {}
25
- * ```
26
- */
27
- export class AngularHttpAdapter {
28
- http;
29
- constructor(http) {
30
- this.http = http;
31
- }
32
- /**
33
- * Safely parse a JSON response body.
34
- *
35
- * Angular's fetch backend (`withFetch()`) will throw a raw `SyntaxError` if
36
- * `responseType: 'json'` is used and the backend returns HTML (common for
37
- * proxies, 502 pages, SSR fallbacks, or misrouted requests).
38
- *
39
- * To avoid crashing consumer apps, we always request as text and then parse
40
- * JSON only when the response actually looks like JSON.
41
- *
42
- * @param bodyText - Raw response body as text
43
- * @param contentType - Content-Type header value (if available)
44
- * @returns Parsed JSON value (unknown)
45
- * @throws {SyntaxError} When body is non-empty but not valid JSON
46
- */
47
- parseJsonBody(bodyText, contentType) {
48
- const trimmed = bodyText.trim();
49
- if (!trimmed)
50
- return null;
51
- // If it's clearly HTML, never attempt JSON.parse (some proxies mislabel Content-Type).
52
- if (trimmed.startsWith('<')) {
53
- return bodyText;
54
- }
55
- const looksLikeJson = trimmed.startsWith('{') || trimmed.startsWith('[');
56
- const isJsonContentType = typeof contentType === 'string' && contentType.toLowerCase().includes('application/json');
57
- if (!looksLikeJson && !isJsonContentType) {
58
- // Return raw text when it doesn't look like JSON (e.g., HTML error pages).
59
- return bodyText;
60
- }
61
- return JSON.parse(trimmed);
62
- }
63
- /**
64
- * Execute HTTP request using Angular's HttpClient.
65
- *
66
- * @param config - Request configuration
67
- * @returns Response with parsed data
68
- * @throws NAuthClientError if request fails
69
- */
70
- async request(config) {
71
- try {
72
- // Use Angular's HttpClient - goes through ALL interceptors.
73
- // IMPORTANT: Use responseType 'text' to avoid raw JSON.parse crashes when
74
- // the backend returns HTML (seen in some proxy/SSR/misroute setups).
75
- const res = await firstValueFrom(this.http.request(config.method, config.url, {
76
- body: config.body,
77
- headers: config.headers,
78
- withCredentials: config.credentials === 'include',
79
- observe: 'response',
80
- responseType: 'text',
81
- }));
82
- const contentType = res.headers?.get('content-type');
83
- const parsed = this.parseJsonBody(res.body ?? '', contentType);
84
- return {
85
- data: parsed,
86
- status: res.status,
87
- headers: {}, // Reserved for future header passthrough if needed
88
- };
89
- }
90
- catch (error) {
91
- if (error instanceof HttpErrorResponse) {
92
- // Convert Angular's HttpErrorResponse to NAuthClientError.
93
- // When using responseType 'text', `error.error` is typically a string.
94
- const contentType = error.headers?.get('content-type') ?? null;
95
- const rawBody = typeof error.error === 'string' ? error.error : '';
96
- const parsedError = this.parseJsonBody(rawBody, contentType);
97
- const errorData = typeof parsedError === 'object' && parsedError !== null ? parsedError : {};
98
- const code = typeof errorData['code'] === 'string' ? errorData['code'] : NAuthErrorCode.INTERNAL_ERROR;
99
- const message = typeof errorData['message'] === 'string'
100
- ? errorData['message']
101
- : typeof parsedError === 'string' && parsedError.trim()
102
- ? parsedError
103
- : error.message || `Request failed with status ${error.status}`;
104
- const timestamp = typeof errorData['timestamp'] === 'string' ? errorData['timestamp'] : undefined;
105
- const details = typeof errorData['details'] === 'object' ? errorData['details'] : undefined;
106
- throw new NAuthClientError(code, message, {
107
- statusCode: error.status,
108
- timestamp,
109
- details,
110
- isNetworkError: error.status === 0, // Network error (no response from server)
111
- });
112
- }
113
- // Re-throw non-HTTP errors as an SDK error so consumers don't see raw parser crashes.
114
- const message = error instanceof Error ? error.message : 'Unknown error';
115
- throw new NAuthClientError(NAuthErrorCode.INTERNAL_ERROR, message, {
116
- statusCode: 0,
117
- isNetworkError: true,
118
- });
119
- }
120
- }
121
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularHttpAdapter, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
122
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularHttpAdapter });
123
- }
124
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularHttpAdapter, decorators: [{
125
- type: Injectable
126
- }], ctorParameters: () => [{ type: i1.HttpClient }] });
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3RhbmRhbG9uZS9odHRwLWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBMEMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7OztBQUVqSDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILE1BQU0sT0FBTyxrQkFBa0I7SUFDQTtJQUE3QixZQUE2QixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO0lBQUcsQ0FBQztJQUVqRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNLLGFBQWEsQ0FBQyxRQUFnQixFQUFFLFdBQTBCO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTFCLHVGQUF1RjtRQUN2RixJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1QixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxXQUFXLEtBQUssUUFBUSxJQUFJLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUVwSCxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZ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LENBQUM7Z0JBRXpILE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFO29CQUN4QyxVQUFVLEVBQUUsS0FBSyxDQUFDLE1BQU07b0JBQ3hCLFNBQVM7b0JBQ1QsT0FBTztvQkFDUCxjQUFjLEVBQUUsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsMENBQTBDO2lCQUMvRSxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsc0ZBQXNGO1lBQ3RGLE1BQU0sT0FBTyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztZQUN6RSxNQUFNLElBQUksZ0JBQWdCLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUU7Z0JBQ2pFLFVBQVUsRUFBRSxDQUFDO2dCQUNiLGNBQWMsRUFBRSxJQUFJO2FBQ3JCLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO3dHQXRHVSxrQkFBa0I7NEdBQWxCLGtCQUFrQjs7NEZBQWxCLGtCQUFrQjtrQkFEOUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEh0dHBBZGFwdGVyLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlLCBOQXV0aENsaWVudEVycm9yLCBOQXV0aEVycm9yQ29kZSB9IGZyb20gJ0BuYXV0aC10b29sa2l0L2NsaWVudCc7XG5cbi8qKlxuICogSFRUUCBhZGFwdGVyIGZvciBBbmd1bGFyIHVzaW5nIEh0dHBDbGllbnQuXG4gKlxuICogVGhpcyBhZGFwdGVyOlxuICogLSBVc2VzIEFuZ3VsYXIncyBIdHRwQ2xpZW50IGZvciBhbGwgcmVxdWVzdHNcbiAqIC0gV29ya3Mgd2l0aCBBbmd1bGFyJ3MgSFRUUCBpbnRlcmNlcHRvcnMgKGluY2x1ZGluZyBhdXRoSW50ZXJjZXB0b3IpXG4gKiAtIEF1dG8tcHJvdmlkZWQgdmlhIEFuZ3VsYXIgREkgKHByb3ZpZGVkSW46ICdyb290JylcbiAqIC0gQ29udmVydHMgSHR0cENsaWVudCByZXNwb25zZXMgdG8gSHR0cFJlc3BvbnNlIGZvcm1hdFxuICogLSBDb252ZXJ0cyBIdHRwRXJyb3JSZXNwb25zZSB0byBOQXV0aENsaWVudEVycm9yXG4gKlxuICogVXNlcnMgZG9uJ3QgbmVlZCB0byBjb25maWd1cmUgdGhpcyBtYW51YWxseSAtIGl0J3MgYXV0b21hdGljYWxseVxuICogaW5qZWN0ZWQgd2hlbiB1c2luZyBBdXRoU2VydmljZSBpbiBBbmd1bGFyIGFwcHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEF1dG9tYXRpYyB1c2FnZSAobm8gbWFudWFsIHNldHVwIG5lZWRlZClcbiAqIC8vIEF1dGhTZXJ2aWNlIGF1dG9tYXRpY2FsbHkgaW5qZWN0cyBBbmd1bGFySHR0cEFkYXB0ZXJcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgYXV0aDogQXV0aFNlcnZpY2UpIHt9XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJIdHRwQWRhcHRlciBpbXBsZW1lbnRzIEh0dHBBZGFwdGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBodHRwOiBIdHRwQ2xpZW50KSB7fVxuXG4gIC8qKlxuICAgKiBTYWZlbHkgcGFyc2UgYSBKU09OIHJlc3BvbnNlIGJvZHkuXG4gICAqXG4gICAqIEFuZ3VsYXIncyBmZXRjaCBiYWNrZW5kIChgd2l0aEZldGNoKClgKSB3aWxsIHRocm93IGEgcmF3IGBTeW50YXhFcnJvcmAgaWZcbiAgICogYHJlc3BvbnNlVHlwZTogJ2pzb24nYCBpcyB1c2VkIGFuZCB0aGUgYmFja2VuZCByZXR1cm5zIEhUTUwgKGNvbW1vbiBmb3JcbiAgICogcHJveGllcywgNTAyIHBhZ2VzLCBTU1IgZmFsbGJhY2tzLCBvciBtaXNyb3V0ZWQgcmVxdWVzdHMpLlxuICAgKlxuICAgKiBUbyBhdm9pZCBjcmFzaGluZyBjb25zdW1lciBhcHBzLCB3ZSBhbHdheXMgcmVxdWVzdCBhcyB0ZXh0IGFuZCB0aGVuIHBhcnNlXG4gICAqIEpTT04gb25seSB3aGVuIHRoZSByZXNwb25zZSBhY3R1YWxseSBsb29rcyBsaWtlIEpTT04uXG4gICAqXG4gICAqIEBwYXJhbSBib2R5VGV4dCAtIFJhdyByZXNwb25zZSBib2R5IGFzIHRleHRcbiAgICogQHBhcmFtIGNvbnRlbnRUeXBlIC0gQ29udGVudC1UeXBlIGhlYWRlciB2YWx1ZSAoaWYgYXZhaWxhYmxlKVxuICAgKiBAcmV0dXJucyBQYXJzZWQgSlNPTiB2YWx1ZSAodW5rbm93bilcbiAgICogQHRocm93cyB7U3ludGF4RXJyb3J9IFdoZW4gYm9keSBpcyBub24tZW1wdHkgYnV0IG5vdCB2YWxpZCBKU09OXG4gICAqL1xuICBwcml2YXRlIHBhcnNlSnNvbkJvZHkoYm9keVRleHQ6IHN0cmluZywgY29udGVudFR5cGU6IHN0cmluZyB8IG51bGwpOiB1bmtub3duIHtcbiAgICBjb25zdCB0cmltbWVkID0gYm9keVRleHQudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBJZiBpdCdzIGNsZWFybHkgSFRNTCwgbmV2ZXIgYXR0ZW1wdCBKU09OLnBhcnNlIChzb21lIHByb3hpZXMgbWlzbGFiZWwgQ29udGVudC1UeXBlKS5cbiAgICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIHJldHVybiBib2R5VGV4dDtcbiAgICB9XG5cbiAgICBjb25zdCBsb29rc0xpa2VKc29uID0gdHJpbW1lZC5zdGFydHNXaXRoKCd7JykgfHwgdHJpbW1lZC5zdGFydHNXaXRoKCdbJyk7XG4gICAgY29uc3QgaXNKc29uQ29udGVudFR5cGUgPSB0eXBlb2YgY29udGVudFR5cGUgPT09ICdzdHJpbmcnICYmIGNvbnRlbnRUeXBlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKTtcblxuICAgIGlmICghbG9va3NMaWtlSnNvbiAmJiAhaXNKc29uQ29udGVudFR5cGUpIHtcbiAgICAgIC8vIFJldHVybiByYXcgdGV4dCB3aGVuIGl0IGRvZXNuJ3QgbG9vayBsaWtlIEpTT04gKGUuZy4sIEhUTUwgZXJyb3IgcGFnZXMpLlxuICAgICAgcmV0dXJuIGJvZHlUZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBKU09OLnBhcnNlKHRyaW1tZWQpIGFzIHVua25vd247XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBIVFRQIHJlcXVlc3QgdXNpbmcgQW5ndWxhcidzIEh0dHBDbGllbnQuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBSZXF1ZXN0IGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybnMgUmVzcG9uc2Ugd2l0aCBwYXJzZWQgZGF0YVxuICAgKiBAdGhyb3dzIE5BdXRoQ2xpZW50RXJyb3IgaWYgcmVxdWVzdCBmYWlsc1xuICAgKi9cbiAgYXN5bmMgcmVxdWVzdDxUPihjb25maWc6IEh0dHBSZXF1ZXN0KTogUHJvbWlzZTxIdHRwUmVzcG9uc2U8VD4+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVXNlIEFuZ3VsYXIncyBIdHRwQ2xpZW50IC0gZ29lcyB0aHJvdWdoIEFMTCBpbnRlcmNlcHRvcnMuXG4gICAgICAvLyBJTVBPUlRBTlQ6IFVzZSByZXNwb25zZVR5cGUgJ3RleHQnIHRvIGF2b2lkIHJhdyBKU09OLnBhcnNlIGNyYXNoZXMgd2hlblxuICAgICAgLy8gdGhlIGJhY2tlbmQgcmV0dXJucyBIVE1MIChzZWVuIGluIHNvbWUgcHJveHkvU1NSL21pc3JvdXRlIHNldHVwcykuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5odHRwLnJlcXVlc3QoY29uZmlnLm1ldGhvZCwgY29uZmlnLnVybCwge1xuICAgICAgICAgIGJvZHk6IGNvbmZpZy5ib2R5LFxuICAgICAgICAgIGhlYWRlcnM6IGNvbmZpZy5oZWFkZXJzLFxuICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogY29uZmlnLmNyZWRlbnRpYWxzID09PSAnaW5jbHVkZScsXG4gICAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyxcbiAgICAgICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JyxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlcy5oZWFkZXJzPy5nZXQoJ2NvbnRlbnQtdHlwZScpO1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZUpzb25Cb2R5KHJlcy5ib2R5ID8/ICcnLCBjb250ZW50VHlwZSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHBhcnNlZCBhcyBULFxuICAgICAgICBzdGF0dXM6IHJlcy5zdGF0dXMsXG4gICAgICAgIGhlYWRlcnM6IHt9LCAvLyBSZXNlcnZlZCBmb3IgZnV0dXJlIGhlYWRlciBwYXNzdGhyb3VnaCBpZiBuZWVkZWRcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XG4gICAgICAgIC8vIENvbnZlcnQgQW5ndWxhcidzIEh0dHBFcnJvclJlc3BvbnNlIHRvIE5BdXRoQ2xpZW50RXJyb3IuXG4gICAgICAgIC8vIFdoZW4gdXNpbmcgcmVzcG9uc2VUeXBlICd0ZXh0JywgYGVycm9yLmVycm9yYCBpcyB0eXBpY2FsbHkgYSBzdHJpbmcuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gZXJyb3IuaGVhZGVycz8uZ2V0KCdjb250ZW50LXR5cGUnKSA/PyBudWxsO1xuICAgICAgICBjb25zdCByYXdCb2R5ID0gdHlwZW9mIGVycm9yLmVycm9yID09PSAnc3RyaW5nJyA/IGVycm9yLmVycm9yIDogJyc7XG4gICAgICAgIGNvbnN0IHBhcnNlZEVycm9yID0gdGhpcy5wYXJzZUpzb25Cb2R5KHJhd0JvZHksIGNvbnRlbnRUeXBlKTtcblxuICAgICAgICBjb25zdCBlcnJvckRhdGEgPSB0eXBlb2YgcGFyc2VkRXJyb3IgPT09ICdvYmplY3QnICYmIHBhcnNlZEVycm9yICE9PSBudWxsID8gKHBhcnNlZEVycm9yIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA6IHt9O1xuICAgICAgICBjb25zdCBjb2RlID0gdHlwZW9mIGVycm9yRGF0YVsnY29kZSddID09PSAnc3RyaW5nJyA/IChlcnJvckRhdGFbJ2NvZGUnXSBhcyBOQXV0aEVycm9yQ29kZSkgOiBOQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgICAgdHlwZW9mIGVycm9yRGF0YVsnbWVzc2FnZSddID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyAoZXJyb3JEYXRhWydtZXNzYWdlJ10gYXMgc3RyaW5nKVxuICAgICAgICAgICAgOiB0eXBlb2YgcGFyc2VkRXJyb3IgPT09ICdzdHJpbmcnICYmIHBhcnNlZEVycm9yLnRyaW0oKVxuICAgICAgICAgICAgICA/IHBhcnNlZEVycm9yXG4gICAgICAgICAgICAgIDogZXJyb3IubWVzc2FnZSB8fCBgUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtlcnJvci5zdGF0dXN9YDtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gdHlwZW9mIGVycm9yRGF0YVsndGltZXN0YW1wJ10gPT09ICdzdHJpbmcnID8gKGVycm9yRGF0YVsndGltZXN0YW1wJ10gYXMgc3RyaW5nKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IHR5cGVvZiBlcnJvckRhdGFbJ2RldGFpbHMnXSA9PT0gJ29iamVjdCcgPyAoZXJyb3JEYXRhWydkZXRhaWxzJ10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHRocm93IG5ldyBOQXV0aENsaWVudEVycm9yKGNvZGUsIG1lc3NhZ2UsIHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiBlcnJvci5zdGF0dXMsXG4gICAgICAgICAgdGltZXN0YW1wLFxuICAgICAgICAgIGRldGFpbHMsXG4gICAgICAgICAgaXNOZXR3b3JrRXJyb3I6IGVycm9yLnN0YXR1cyA9PT0gMCwgLy8gTmV0d29yayBlcnJvciAobm8gcmVzcG9uc2UgZnJvbSBzZXJ2ZXIpXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBSZS10aHJvdyBub24tSFRUUCBlcnJvcnMgYXMgYW4gU0RLIGVycm9yIHNvIGNvbnN1bWVycyBkb24ndCBzZWUgcmF3IHBhcnNlciBjcmFzaGVzLlxuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InO1xuICAgICAgdGhyb3cgbmV3IE5BdXRoQ2xpZW50RXJyb3IoTkF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IsIG1lc3NhZ2UsIHtcbiAgICAgICAgc3RhdHVzQ29kZTogMCxcbiAgICAgICAgaXNOZXR3b3JrRXJyb3I6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,85 +0,0 @@
1
- import { inject, PLATFORM_ID } from '@angular/core';
2
- import { isPlatformBrowser } from '@angular/common';
3
- import { AuthService } from './auth.service';
4
- import { NAuthClientError, NAuthErrorCode } from '@nauth-toolkit/client';
5
- /**
6
- * Social redirect callback route guard.
7
- *
8
- * This guard supports the redirect-first social flow where the backend redirects
9
- * back to the frontend with:
10
- * - `appState` (always optional)
11
- * - `exchangeToken` (present for json/hybrid flows, and for cookie flows that return a challenge)
12
- * - `error` / `error_description` (provider errors)
13
- *
14
- * Behavior:
15
- * - If `exchangeToken` exists: exchanges it via backend (SDK handles navigation automatically).
16
- * - If no `exchangeToken`: treat as cookie-success path (SDK handles navigation automatically).
17
- * - If `error` exists: redirects to oauthError route.
18
- *
19
- * @example
20
- * ```typescript
21
- * import { socialRedirectCallbackGuard } from '@nauth-toolkit/client/angular';
22
- *
23
- * export const routes: Routes = [
24
- * { path: 'auth/callback', canActivate: [socialRedirectCallbackGuard], component: CallbackComponent },
25
- * ];
26
- * ```
27
- */
28
- export const socialRedirectCallbackGuard = async () => {
29
- const auth = inject(AuthService);
30
- const platformId = inject(PLATFORM_ID);
31
- const isBrowser = isPlatformBrowser(platformId);
32
- if (!isBrowser) {
33
- return false;
34
- }
35
- const params = new URLSearchParams(window.location.search);
36
- const error = params.get('error');
37
- const exchangeToken = params.get('exchangeToken');
38
- const router = auth.getChallengeRouter();
39
- // Provider error: redirect to oauthError
40
- if (error) {
41
- await router.navigateToError('oauth');
42
- return false;
43
- }
44
- // No exchangeToken: cookie success path; hydrate then navigate to success.
45
- //
46
- // Note: we do not "activate" the callback route to avoid consumers needing to render a page.
47
- if (!exchangeToken) {
48
- // ============================================================================
49
- // Cookies mode: hydrate user state before redirecting
50
- // ============================================================================
51
- // WHY: In cookie delivery, the OAuth callback completes via browser redirects, so the frontend
52
- // does not receive a JSON AuthResponse to populate the SDK's cached `currentUser`.
53
- //
54
- // Without this, sync guards (`authGuard`) can immediately redirect to /login because
55
- // `currentUser` is still null even though cookies were set successfully.
56
- try {
57
- await auth.getProfile();
58
- await router.navigateToSuccess();
59
- }
60
- catch (err) {
61
- // Only treat auth failures (401/403) as OAuth errors
62
- // Network errors or other issues might be temporary - still try success route
63
- const isAuthError = err instanceof NAuthClientError &&
64
- (err.statusCode === 401 ||
65
- err.statusCode === 403 ||
66
- err.code === NAuthErrorCode.AUTH_TOKEN_INVALID ||
67
- err.code === NAuthErrorCode.AUTH_SESSION_EXPIRED ||
68
- err.code === NAuthErrorCode.AUTH_SESSION_NOT_FOUND);
69
- if (isAuthError) {
70
- // Cookies weren't set properly - OAuth failed
71
- await router.navigateToError('oauth');
72
- }
73
- else {
74
- // For network errors or other issues, proceed to success route
75
- // The auth guard will handle authentication state on the next route
76
- await router.navigateToSuccess();
77
- }
78
- }
79
- return false;
80
- }
81
- // Exchange token - SDK handles navigation automatically
82
- await auth.exchangeSocialRedirect(exchangeToken);
83
- return false;
84
- };
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29jaWFsLXJlZGlyZWN0LWNhbGxiYWNrLmd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3RhbmRhbG9uZS9zb2NpYWwtcmVkaXJlY3QtY2FsbGJhY2suZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFrQixLQUFLLElBQXNCLEVBQUU7SUFDckYsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN2QyxNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVoRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNsRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUV6Qyx5Q0FBeUM7SUFDekMsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLE1BQU0sTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsRUFBRTtJQUNGLDZGQUE2RjtJQUM3RixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsK0VBQStFO1FBQy9FLHNEQUFzRDtRQUN0RCwrRUFBK0U7UUFDL0UsK0ZBQStGO1FBQy9GLG1GQUFtRjtRQUNuRixFQUFFO1FBQ0YscUZBQXFGO1FBQ3JGLHlFQUF5RTtRQUN6RSxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QixNQUFNLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ25DLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IscURBQXFEO1lBQ3JELDhFQUE4RTtZQUM5RSxNQUFNLFdBQVcsR0FDZixHQUFHLFlBQVksZ0JBQWdCO2dCQUMvQixDQUFDLEdBQUcsQ0FBQyxVQUFVLEtBQUssR0FBRztvQkFDckIsR0FBRyxDQUFDLFVBQVUsS0FBSyxHQUFHO29CQUN0QixHQUFHLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxrQkFBa0I7b0JBQzlDLEdBQUcsQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDLG9CQUFvQjtvQkFDaEQsR0FBRyxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUV4RCxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQiw4Q0FBOEM7Z0JBQzlDLE1BQU0sTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sK0RBQStEO2dCQUMvRCxvRUFBb0U7Z0JBQ3BFLE1BQU0sTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCx3REFBd0Q7SUFDeEQsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDakQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyB0eXBlIENhbkFjdGl2YXRlRm4gfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBOQVVUSF9DTElFTlRfQ09ORklHIH0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHsgTkF1dGhDbGllbnRFcnJvciwgTkF1dGhFcnJvckNvZGUgfSBmcm9tICdAbmF1dGgtdG9vbGtpdC9jbGllbnQnO1xuXG4vKipcbiAqIFNvY2lhbCByZWRpcmVjdCBjYWxsYmFjayByb3V0ZSBndWFyZC5cbiAqXG4gKiBUaGlzIGd1YXJkIHN1cHBvcnRzIHRoZSByZWRpcmVjdC1maXJzdCBzb2NpYWwgZmxvdyB3aGVyZSB0aGUgYmFja2VuZCByZWRpcmVjdHNcbiAqIGJhY2sgdG8gdGhlIGZyb250ZW5kIHdpdGg6XG4gKiAtIGBhcHBTdGF0ZWAgKGFsd2F5cyBvcHRpb25hbClcbiAqIC0gYGV4Y2hhbmdlVG9rZW5gIChwcmVzZW50IGZvciBqc29uL2h5YnJpZCBmbG93cywgYW5kIGZvciBjb29raWUgZmxvd3MgdGhhdCByZXR1cm4gYSBjaGFsbGVuZ2UpXG4gKiAtIGBlcnJvcmAgLyBgZXJyb3JfZGVzY3JpcHRpb25gIChwcm92aWRlciBlcnJvcnMpXG4gKlxuICogQmVoYXZpb3I6XG4gKiAtIElmIGBleGNoYW5nZVRva2VuYCBleGlzdHM6IGV4Y2hhbmdlcyBpdCB2aWEgYmFja2VuZCAoU0RLIGhhbmRsZXMgbmF2aWdhdGlvbiBhdXRvbWF0aWNhbGx5KS5cbiAqIC0gSWYgbm8gYGV4Y2hhbmdlVG9rZW5gOiB0cmVhdCBhcyBjb29raWUtc3VjY2VzcyBwYXRoIChTREsgaGFuZGxlcyBuYXZpZ2F0aW9uIGF1dG9tYXRpY2FsbHkpLlxuICogLSBJZiBgZXJyb3JgIGV4aXN0czogcmVkaXJlY3RzIHRvIG9hdXRoRXJyb3Igcm91dGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHNvY2lhbFJlZGlyZWN0Q2FsbGJhY2tHdWFyZCB9IGZyb20gJ0BuYXV0aC10b29sa2l0L2NsaWVudC9hbmd1bGFyJztcbiAqXG4gKiBleHBvcnQgY29uc3Qgcm91dGVzOiBSb3V0ZXMgPSBbXG4gKiAgIHsgcGF0aDogJ2F1dGgvY2FsbGJhY2snLCBjYW5BY3RpdmF0ZTogW3NvY2lhbFJlZGlyZWN0Q2FsbGJhY2tHdWFyZF0sIGNvbXBvbmVudDogQ2FsbGJhY2tDb21wb25lbnQgfSxcbiAqIF07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHNvY2lhbFJlZGlyZWN0Q2FsbGJhY2tHdWFyZDogQ2FuQWN0aXZhdGVGbiA9IGFzeW5jICgpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYXV0aCA9IGluamVjdChBdXRoU2VydmljZSk7XG4gIGNvbnN0IHBsYXRmb3JtSWQgPSBpbmplY3QoUExBVEZPUk1fSUQpO1xuICBjb25zdCBpc0Jyb3dzZXIgPSBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKTtcblxuICBpZiAoIWlzQnJvd3Nlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gIGNvbnN0IGVycm9yID0gcGFyYW1zLmdldCgnZXJyb3InKTtcbiAgY29uc3QgZXhjaGFuZ2VUb2tlbiA9IHBhcmFtcy5nZXQoJ2V4Y2hhbmdlVG9rZW4nKTtcbiAgY29uc3Qgcm91dGVyID0gYXV0aC5nZXRDaGFsbGVuZ2VSb3V0ZXIoKTtcblxuICAvLyBQcm92aWRlciBlcnJvcjogcmVkaXJlY3QgdG8gb2F1dGhFcnJvclxuICBpZiAoZXJyb3IpIHtcbiAgICBhd2FpdCByb3V0ZXIubmF2aWdhdGVUb0Vycm9yKCdvYXV0aCcpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIE5vIGV4Y2hhbmdlVG9rZW46IGNvb2tpZSBzdWNjZXNzIHBhdGg7IGh5ZHJhdGUgdGhlbiBuYXZpZ2F0ZSB0byBzdWNjZXNzLlxuICAvL1xuICAvLyBOb3RlOiB3ZSBkbyBub3QgXCJhY3RpdmF0ZVwiIHRoZSBjYWxsYmFjayByb3V0ZSB0byBhdm9pZCBjb25zdW1lcnMgbmVlZGluZyB0byByZW5kZXIgYSBwYWdlLlxuICBpZiAoIWV4Y2hhbmdlVG9rZW4pIHtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQ29va2llcyBtb2RlOiBoeWRyYXRlIHVzZXIgc3RhdGUgYmVmb3JlIHJlZGlyZWN0aW5nXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIFdIWTogSW4gY29va2llIGRlbGl2ZXJ5LCB0aGUgT0F1dGggY2FsbGJhY2sgY29tcGxldGVzIHZpYSBicm93c2VyIHJlZGlyZWN0cywgc28gdGhlIGZyb250ZW5kXG4gICAgLy8gZG9lcyBub3QgcmVjZWl2ZSBhIEpTT04gQXV0aFJlc3BvbnNlIHRvIHBvcHVsYXRlIHRoZSBTREsncyBjYWNoZWQgYGN1cnJlbnRVc2VyYC5cbiAgICAvL1xuICAgIC8vIFdpdGhvdXQgdGhpcywgc3luYyBndWFyZHMgKGBhdXRoR3VhcmRgKSBjYW4gaW1tZWRpYXRlbHkgcmVkaXJlY3QgdG8gL2xvZ2luIGJlY2F1c2VcbiAgICAvLyBgY3VycmVudFVzZXJgIGlzIHN0aWxsIG51bGwgZXZlbiB0aG91Z2ggY29va2llcyB3ZXJlIHNldCBzdWNjZXNzZnVsbHkuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGF1dGguZ2V0UHJvZmlsZSgpO1xuICAgICAgYXdhaXQgcm91dGVyLm5hdmlnYXRlVG9TdWNjZXNzKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBPbmx5IHRyZWF0IGF1dGggZmFpbHVyZXMgKDQwMS80MDMpIGFzIE9BdXRoIGVycm9yc1xuICAgICAgLy8gTmV0d29yayBlcnJvcnMgb3Igb3RoZXIgaXNzdWVzIG1pZ2h0IGJlIHRlbXBvcmFyeSAtIHN0aWxsIHRyeSBzdWNjZXNzIHJvdXRlXG4gICAgICBjb25zdCBpc0F1dGhFcnJvciA9XG4gICAgICAgIGVyciBpbnN0YW5jZW9mIE5BdXRoQ2xpZW50RXJyb3IgJiZcbiAgICAgICAgKGVyci5zdGF0dXNDb2RlID09PSA0MDEgfHxcbiAgICAgICAgICBlcnIuc3RhdHVzQ29kZSA9PT0gNDAzIHx8XG4gICAgICAgICAgZXJyLmNvZGUgPT09IE5BdXRoRXJyb3JDb2RlLkFVVEhfVE9LRU5fSU5WQUxJRCB8fFxuICAgICAgICAgIGVyci5jb2RlID09PSBOQXV0aEVycm9yQ29kZS5BVVRIX1NFU1NJT05fRVhQSVJFRCB8fFxuICAgICAgICAgIGVyci5jb2RlID09PSBOQXV0aEVycm9yQ29kZS5BVVRIX1NFU1NJT05fTk9UX0ZPVU5EKTtcblxuICAgICAgaWYgKGlzQXV0aEVycm9yKSB7XG4gICAgICAgIC8vIENvb2tpZXMgd2VyZW4ndCBzZXQgcHJvcGVybHkgLSBPQXV0aCBmYWlsZWRcbiAgICAgICAgYXdhaXQgcm91dGVyLm5hdmlnYXRlVG9FcnJvcignb2F1dGgnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBuZXR3b3JrIGVycm9ycyBvciBvdGhlciBpc3N1ZXMsIHByb2NlZWQgdG8gc3VjY2VzcyByb3V0ZVxuICAgICAgICAvLyBUaGUgYXV0aCBndWFyZCB3aWxsIGhhbmRsZSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBvbiB0aGUgbmV4dCByb3V0ZVxuICAgICAgICBhd2FpdCByb3V0ZXIubmF2aWdhdGVUb1N1Y2Nlc3MoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gRXhjaGFuZ2UgdG9rZW4gLSBTREsgaGFuZGxlcyBuYXZpZ2F0aW9uIGF1dG9tYXRpY2FsbHlcbiAgYXdhaXQgYXV0aC5leGNoYW5nZVNvY2lhbFJlZGlyZWN0KGV4Y2hhbmdlVG9rZW4pO1xuICByZXR1cm4gZmFsc2U7XG59O1xuIl19
@@ -1,6 +0,0 @@
1
- import { InjectionToken } from '@angular/core';
2
- /**
3
- * Injection token for providing NAuthClientConfig in Angular apps.
4
- */
5
- export const NAUTH_CLIENT_CONFIG = new InjectionToken('NAUTH_CLIENT_CONFIG');
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3RhbmRhbG9uZS90b2tlbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUcvQzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksY0FBYyxDQUFvQixxQkFBcUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5BdXRoQ2xpZW50Q29uZmlnIH0gZnJvbSAnQG5hdXRoLXRvb2xraXQvY2xpZW50JztcblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gZm9yIHByb3ZpZGluZyBOQXV0aENsaWVudENvbmZpZyBpbiBBbmd1bGFyIGFwcHMuXG4gKi9cbmV4cG9ydCBjb25zdCBOQVVUSF9DTElFTlRfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPE5BdXRoQ2xpZW50Q29uZmlnPignTkFVVEhfQ0xJRU5UX0NPTkZJRycpO1xuIl19
@@ -1,71 +0,0 @@
1
- import { CanActivateFn, Router, UrlTree } from '@angular/router';
2
- import { AuthService } from './auth.service';
3
- import type { NAuthClientConfig } from '@nauth-toolkit/client';
4
- /**
5
- * Functional route guard for authentication (Angular 17+).
6
- *
7
- * Protects routes by checking if user is authenticated.
8
- * Redirects to configured session expired route (or login) if not authenticated.
9
- *
10
- * @param redirectTo - Optional path to redirect to if not authenticated. If not provided, uses `redirects.sessionExpired` from config (defaults to '/login')
11
- * @returns CanActivateFn guard function
12
- *
13
- * @example
14
- * ```typescript
15
- * // In route configuration - uses config.redirects.sessionExpired
16
- * const routes: Routes = [
17
- * {
18
- * path: 'home',
19
- * component: HomeComponent,
20
- * canActivate: [authGuard()]
21
- * }
22
- * ];
23
- *
24
- * // Override with custom route
25
- * const routes: Routes = [
26
- * {
27
- * path: 'admin',
28
- * component: AdminComponent,
29
- * canActivate: [authGuard('/admin/login')]
30
- * }
31
- * ];
32
- * ```
33
- */
34
- export declare function authGuard(redirectTo?: string): CanActivateFn;
35
- /**
36
- * Class-based authentication guard for NgModule compatibility.
37
- *
38
- * @example
39
- * ```typescript
40
- * // In route configuration (NgModule)
41
- * const routes: Routes = [
42
- * {
43
- * path: 'home',
44
- * component: HomeComponent,
45
- * canActivate: [AuthGuard]
46
- * }
47
- * ];
48
- *
49
- * // In module providers
50
- * @NgModule({
51
- * providers: [AuthGuard]
52
- * })
53
- * ```
54
- */
55
- export declare class AuthGuard {
56
- private auth;
57
- private router;
58
- private config?;
59
- /**
60
- * @param auth - Authentication service
61
- * @param router - Angular router
62
- * @param config - Optional client configuration (injected automatically)
63
- */
64
- constructor(auth: AuthService, router: Router, config?: NAuthClientConfig);
65
- /**
66
- * Check if route can be activated.
67
- *
68
- * @returns True if authenticated, otherwise redirects to configured session expired route (or '/login')
69
- */
70
- canActivate(): boolean | UrlTree;
71
- }
@@ -1,15 +0,0 @@
1
- import { HttpHandlerFn, HttpInterceptorFn, HttpRequest } from '@angular/common/http';
2
- /**
3
- * Angular HTTP interceptor for nauth-toolkit.
4
- *
5
- * Handles:
6
- * - Cookies mode: withCredentials + CSRF tokens + refresh via POST
7
- * - JSON mode: refresh via SDK, retry with new token
8
- */
9
- export declare const authInterceptor: HttpInterceptorFn;
10
- /**
11
- * Class-based interceptor for NgModule compatibility.
12
- */
13
- export declare class AuthInterceptor {
14
- intercept(req: HttpRequest<unknown>, next: HttpHandlerFn): import("rxjs").Observable<import("@angular/common/http").HttpEvent<unknown>>;
15
- }