@nauth-toolkit/client-angular 0.1.92 → 0.1.93
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/esm2022/lib/recaptcha-provider.mjs +52 -0
- package/esm2022/lib/recaptcha.service.mjs +14 -2
- package/esm2022/ngmodule/auth.service.mjs +1 -1
- package/esm2022/ngmodule/nauth.module.mjs +60 -27
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/nauth-toolkit-client-angular.mjs +122 -28
- package/fesm2022/nauth-toolkit-client-angular.mjs.map +1 -1
- package/lib/recaptcha-provider.d.ts +27 -0
- package/ngmodule/nauth.module.d.ts +17 -3
- package/package.json +2 -2
- package/public-api.d.ts +1 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NgModule, inject } from '@angular/core';
|
|
1
|
+
import { NgModule, inject, Optional, APP_INITIALIZER } from '@angular/core';
|
|
2
2
|
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
|
|
3
3
|
import { Router } from '@angular/router';
|
|
4
4
|
import { NAUTH_CLIENT_CONFIG } from './tokens';
|
|
@@ -6,13 +6,14 @@ import { AuthService } from './auth.service';
|
|
|
6
6
|
import { AngularHttpAdapter } from './http-adapter';
|
|
7
7
|
import { AuthInterceptorClass } from './auth.interceptor.class';
|
|
8
8
|
import { AuthGuard } from '../lib/auth.guard';
|
|
9
|
+
import { RecaptchaService, RECAPTCHA_CONFIG } from '../lib/recaptcha.service';
|
|
9
10
|
import * as i0 from "@angular/core";
|
|
10
11
|
/**
|
|
11
12
|
* NgModule for nauth-toolkit Angular integration.
|
|
12
13
|
*
|
|
13
14
|
* Use this for NgModule-based apps (Angular 17+ with NgModule or legacy apps).
|
|
14
15
|
*
|
|
15
|
-
* @example
|
|
16
|
+
* @example Basic Setup
|
|
16
17
|
* ```typescript
|
|
17
18
|
* // app.module.ts
|
|
18
19
|
* import { NAuthModule } from '@nauth-toolkit/client-angular';
|
|
@@ -27,35 +28,67 @@ import * as i0 from "@angular/core";
|
|
|
27
28
|
* })
|
|
28
29
|
* export class AppModule {}
|
|
29
30
|
* ```
|
|
31
|
+
*
|
|
32
|
+
* @example With reCAPTCHA Enterprise
|
|
33
|
+
* ```typescript
|
|
34
|
+
* NAuthModule.forRoot({
|
|
35
|
+
* baseUrl: 'http://localhost:3000/auth',
|
|
36
|
+
* tokenDelivery: 'cookies',
|
|
37
|
+
* recaptcha: {
|
|
38
|
+
* enabled: true,
|
|
39
|
+
* version: 'enterprise',
|
|
40
|
+
* siteKey: environment.recaptchaSiteKey,
|
|
41
|
+
* action: 'login',
|
|
42
|
+
* },
|
|
43
|
+
* })
|
|
44
|
+
* ```
|
|
30
45
|
*/
|
|
31
46
|
export class NAuthModule {
|
|
32
47
|
static forRoot(config) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
{
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const router = inject(Router, { optional: true });
|
|
47
|
-
return new AuthService(config, httpAdapter, router ?? undefined);
|
|
48
|
-
},
|
|
49
|
-
deps: [AngularHttpAdapter],
|
|
48
|
+
const providers = [
|
|
49
|
+
{
|
|
50
|
+
provide: NAUTH_CLIENT_CONFIG,
|
|
51
|
+
useValue: config,
|
|
52
|
+
},
|
|
53
|
+
AngularHttpAdapter,
|
|
54
|
+
{
|
|
55
|
+
provide: AuthService,
|
|
56
|
+
useFactory: (httpAdapter, recaptchaService) => {
|
|
57
|
+
// Try to inject Router optionally - if not available, pass undefined
|
|
58
|
+
// Router will be undefined if not provided (e.g., in apps without routing)
|
|
59
|
+
const router = inject(Router, { optional: true });
|
|
60
|
+
return new AuthService(config, httpAdapter, router ?? undefined, recaptchaService);
|
|
50
61
|
},
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
62
|
+
deps: [AngularHttpAdapter, [new Optional(), RecaptchaService]],
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
provide: HTTP_INTERCEPTORS,
|
|
66
|
+
useClass: AuthInterceptorClass,
|
|
67
|
+
multi: true,
|
|
68
|
+
},
|
|
69
|
+
// Provide AuthGuard so it has access to NAUTH_CLIENT_CONFIG
|
|
70
|
+
AuthGuard,
|
|
71
|
+
];
|
|
72
|
+
// Add reCAPTCHA providers if configured
|
|
73
|
+
if (config.recaptcha?.enabled) {
|
|
74
|
+
providers.push({
|
|
75
|
+
provide: RECAPTCHA_CONFIG,
|
|
76
|
+
// Cast because interface extends but they're compatible
|
|
77
|
+
useValue: config.recaptcha,
|
|
78
|
+
}, RecaptchaService, {
|
|
79
|
+
provide: APP_INITIALIZER,
|
|
80
|
+
useFactory: () => {
|
|
81
|
+
// Force RecaptchaService instantiation at app startup so script preloads
|
|
82
|
+
inject(RecaptchaService);
|
|
83
|
+
// No-op - constructor already handles preload
|
|
84
|
+
return () => { };
|
|
55
85
|
},
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
86
|
+
multi: true,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
ngModule: NAuthModule,
|
|
91
|
+
providers,
|
|
59
92
|
};
|
|
60
93
|
}
|
|
61
94
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
@@ -69,4 +102,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
69
102
|
exports: [HttpClientModule],
|
|
70
103
|
}]
|
|
71
104
|
}] });
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF1dGgubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25nbW9kdWxlL25hdXRoLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLG1CQUFtQixFQUFzQixNQUFNLFVBQVUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDOztBQUU5RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtDRztBQUtILE1BQU0sT0FBTyxXQUFXO0lBQ3RCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBMEI7UUFDdkMsTUFBTSxTQUFTLEdBQVU7WUFDdkI7Z0JBQ0UsT0FBTyxFQUFFLG1CQUFtQjtnQkFDNUIsUUFBUSxFQUFFLE1BQU07YUFDakI7WUFDRCxrQkFBa0I7WUFDbEI7Z0JBQ0UsT0FBTyxFQUFFLFdBQVc7Z0JBQ3BCLFVBQVUsRUFBRSxDQUFDLFdBQStCLEVBQUUsZ0JBQW1DLEVBQUUsRUFBRTtvQkFDbkYscUVBQXFFO29CQUNyRSwyRUFBMkU7b0JBQzNFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDbEQsT0FBTyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sSUFBSSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztnQkFDckYsQ0FBQztnQkFDRCxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLElBQUksUUFBUSxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQzthQUMvRDtZQUNEO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLEtBQUssRUFBRSxJQUFJO2FBQ1o7WUFDRCw0REFBNEQ7WUFDNUQsU0FBUztTQUNWLENBQUM7UUFFRix3Q0FBd0M7UUFDeEMsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQzlCLFNBQVMsQ0FBQyxJQUFJLENBQ1o7Z0JBQ0UsT0FBTyxFQUFFLGdCQUFnQjtnQkFDekIsd0RBQXdEO2dCQUN4RCxRQUFRLEVBQUUsTUFBTSxDQUFDLFNBQVM7YUFDM0IsRUFDRCxnQkFBZ0IsRUFDaEI7Z0JBQ0UsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLFVBQVUsRUFBRSxHQUFHLEVBQUU7b0JBQ2YseUVBQXlFO29CQUN6RSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDekIsOENBQThDO29CQUM5QyxPQUFPLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztnQkFDbEIsQ0FBQztnQkFDRCxLQUFLLEVBQUUsSUFBSTthQUNaLENBQ0YsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLFdBQVc7WUFDckIsU0FBUztTQUNWLENBQUM7SUFDSixDQUFDO3dHQXJEVSxXQUFXO3lHQUFYLFdBQVcsWUFIWixnQkFBZ0IsYUFDaEIsZ0JBQWdCO3lHQUVmLFdBQVcsWUFIWixnQkFBZ0IsRUFDaEIsZ0JBQWdCOzs0RkFFZixXQUFXO2tCQUp2QixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLGdCQUFnQixDQUFDO29CQUMzQixPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDNUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycywgaW5qZWN0LCBPcHRpb25hbCwgQVBQX0lOSVRJQUxJWkVSIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlLCBIVFRQX0lOVEVSQ0VQVE9SUyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBOQVVUSF9DTElFTlRfQ09ORklHLCBOQXV0aEFuZ3VsYXJDb25maWcgfSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEFuZ3VsYXJIdHRwQWRhcHRlciB9IGZyb20gJy4vaHR0cC1hZGFwdGVyJztcbmltcG9ydCB7IEF1dGhJbnRlcmNlcHRvckNsYXNzIH0gZnJvbSAnLi9hdXRoLmludGVyY2VwdG9yLmNsYXNzJztcbmltcG9ydCB7IEF1dGhHdWFyZCB9IGZyb20gJy4uL2xpYi9hdXRoLmd1YXJkJztcbmltcG9ydCB7IFJlY2FwdGNoYVNlcnZpY2UsIFJFQ0FQVENIQV9DT05GSUcgfSBmcm9tICcuLi9saWIvcmVjYXB0Y2hhLnNlcnZpY2UnO1xuXG4vKipcbiAqIE5nTW9kdWxlIGZvciBuYXV0aC10b29sa2l0IEFuZ3VsYXIgaW50ZWdyYXRpb24uXG4gKlxuICogVXNlIHRoaXMgZm9yIE5nTW9kdWxlLWJhc2VkIGFwcHMgKEFuZ3VsYXIgMTcrIHdpdGggTmdNb2R1bGUgb3IgbGVnYWN5IGFwcHMpLlxuICpcbiAqIEBleGFtcGxlIEJhc2ljIFNldHVwXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBhcHAubW9kdWxlLnRzXG4gKiBpbXBvcnQgeyBOQXV0aE1vZHVsZSB9IGZyb20gJ0BuYXV0aC10b29sa2l0L2NsaWVudC1hbmd1bGFyJztcbiAqXG4gKiBATmdNb2R1bGUoe1xuICogICBpbXBvcnRzOiBbXG4gKiAgICAgTkF1dGhNb2R1bGUuZm9yUm9vdCh7XG4gKiAgICAgICBiYXNlVXJsOiAnaHR0cDovL2xvY2FsaG9zdDozMDAwL2F1dGgnLFxuICogICAgICAgdG9rZW5EZWxpdmVyeTogJ2Nvb2tpZXMnLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFdpdGggcmVDQVBUQ0hBIEVudGVycHJpc2VcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIE5BdXRoTW9kdWxlLmZvclJvb3Qoe1xuICogICBiYXNlVXJsOiAnaHR0cDovL2xvY2FsaG9zdDozMDAwL2F1dGgnLFxuICogICB0b2tlbkRlbGl2ZXJ5OiAnY29va2llcycsXG4gKiAgIHJlY2FwdGNoYToge1xuICogICAgIGVuYWJsZWQ6IHRydWUsXG4gKiAgICAgdmVyc2lvbjogJ2VudGVycHJpc2UnLFxuICogICAgIHNpdGVLZXk6IGVudmlyb25tZW50LnJlY2FwdGNoYVNpdGVLZXksXG4gKiAgICAgYWN0aW9uOiAnbG9naW4nLFxuICogICB9LFxuICogfSlcbiAqIGBgYFxuICovXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbSHR0cENsaWVudE1vZHVsZV0sXG4gIGV4cG9ydHM6IFtIdHRwQ2xpZW50TW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgTkF1dGhNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdChjb25maWc6IE5BdXRoQW5ndWxhckNvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8TkF1dGhNb2R1bGU+IHtcbiAgICBjb25zdCBwcm92aWRlcnM6IGFueVtdID0gW1xuICAgICAge1xuICAgICAgICBwcm92aWRlOiBOQVVUSF9DTElFTlRfQ09ORklHLFxuICAgICAgICB1c2VWYWx1ZTogY29uZmlnLFxuICAgICAgfSxcbiAgICAgIEFuZ3VsYXJIdHRwQWRhcHRlcixcbiAgICAgIHtcbiAgICAgICAgcHJvdmlkZTogQXV0aFNlcnZpY2UsXG4gICAgICAgIHVzZUZhY3Rvcnk6IChodHRwQWRhcHRlcjogQW5ndWxhckh0dHBBZGFwdGVyLCByZWNhcHRjaGFTZXJ2aWNlPzogUmVjYXB0Y2hhU2VydmljZSkgPT4ge1xuICAgICAgICAgIC8vIFRyeSB0byBpbmplY3QgUm91dGVyIG9wdGlvbmFsbHkgLSBpZiBub3QgYXZhaWxhYmxlLCBwYXNzIHVuZGVmaW5lZFxuICAgICAgICAgIC8vIFJvdXRlciB3aWxsIGJlIHVuZGVmaW5lZCBpZiBub3QgcHJvdmlkZWQgKGUuZy4sIGluIGFwcHMgd2l0aG91dCByb3V0aW5nKVxuICAgICAgICAgIGNvbnN0IHJvdXRlciA9IGluamVjdChSb3V0ZXIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBBdXRoU2VydmljZShjb25maWcsIGh0dHBBZGFwdGVyLCByb3V0ZXIgPz8gdW5kZWZpbmVkLCByZWNhcHRjaGFTZXJ2aWNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVwczogW0FuZ3VsYXJIdHRwQWRhcHRlciwgW25ldyBPcHRpb25hbCgpLCBSZWNhcHRjaGFTZXJ2aWNlXV0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwcm92aWRlOiBIVFRQX0lOVEVSQ0VQVE9SUyxcbiAgICAgICAgdXNlQ2xhc3M6IEF1dGhJbnRlcmNlcHRvckNsYXNzLFxuICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICAvLyBQcm92aWRlIEF1dGhHdWFyZCBzbyBpdCBoYXMgYWNjZXNzIHRvIE5BVVRIX0NMSUVOVF9DT05GSUdcbiAgICAgIEF1dGhHdWFyZCxcbiAgICBdO1xuXG4gICAgLy8gQWRkIHJlQ0FQVENIQSBwcm92aWRlcnMgaWYgY29uZmlndXJlZFxuICAgIGlmIChjb25maWcucmVjYXB0Y2hhPy5lbmFibGVkKSB7XG4gICAgICBwcm92aWRlcnMucHVzaChcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IFJFQ0FQVENIQV9DT05GSUcsXG4gICAgICAgICAgLy8gQ2FzdCBiZWNhdXNlIGludGVyZmFjZSBleHRlbmRzIGJ1dCB0aGV5J3JlIGNvbXBhdGlibGVcbiAgICAgICAgICB1c2VWYWx1ZTogY29uZmlnLnJlY2FwdGNoYSxcbiAgICAgICAgfSxcbiAgICAgICAgUmVjYXB0Y2hhU2VydmljZSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUixcbiAgICAgICAgICB1c2VGYWN0b3J5OiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBGb3JjZSBSZWNhcHRjaGFTZXJ2aWNlIGluc3RhbnRpYXRpb24gYXQgYXBwIHN0YXJ0dXAgc28gc2NyaXB0IHByZWxvYWRzXG4gICAgICAgICAgICBpbmplY3QoUmVjYXB0Y2hhU2VydmljZSk7XG4gICAgICAgICAgICAvLyBOby1vcCAtIGNvbnN0cnVjdG9yIGFscmVhZHkgaGFuZGxlcyBwcmVsb2FkXG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge307XG4gICAgICAgICAgfSxcbiAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBOQXV0aE1vZHVsZSxcbiAgICAgIHByb3ZpZGVycyxcbiAgICB9O1xuICB9XG59XG4iXX0=
|
package/esm2022/public-api.mjs
CHANGED
|
@@ -17,4 +17,5 @@ export * from './lib/auth.interceptor';
|
|
|
17
17
|
export * from './lib/auth.guard';
|
|
18
18
|
export * from './lib/social-redirect-callback.guard';
|
|
19
19
|
export * from './lib/recaptcha.service';
|
|
20
|
-
|
|
20
|
+
export * from './lib/recaptcha-provider';
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsNENBQTRDO0FBQzVDLGNBQWMsdUJBQXVCLENBQUM7QUFFdEMsb0RBQW9EO0FBQ3BELGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsbUNBQW1DLENBQUM7QUFDbEQsY0FBYyx5QkFBeUIsQ0FBQztBQUV4QyxzRUFBc0U7QUFDdEUsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsc0NBQXNDLENBQUM7QUFDckQsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLDBCQUEwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgQG5hdXRoLXRvb2xraXQvY2xpZW50LWFuZ3VsYXIgKE5nTW9kdWxlKVxuICpcbiAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgZW50cnkgcG9pbnQgZm9yIE5nTW9kdWxlLWJhc2VkIEFuZ3VsYXIgYXBwcy5cbiAqIEZvciBzdGFuZGFsb25lIGNvbXBvbmVudHMsIHVzZTogQG5hdXRoLXRvb2xraXQvY2xpZW50LWFuZ3VsYXIvc3RhbmRhbG9uZVxuICovXG5cbi8vIFJlLWV4cG9ydCBjb3JlIGNsaWVudCB0eXBlcyBhbmQgdXRpbGl0aWVzXG5leHBvcnQgKiBmcm9tICdAbmF1dGgtdG9vbGtpdC9jbGllbnQnO1xuXG4vLyBFeHBvcnQgTmdNb2R1bGUtc3BlY2lmaWMgY29tcG9uZW50cyAoY2xhc3MtYmFzZWQpXG5leHBvcnQgKiBmcm9tICcuL25nbW9kdWxlL3Rva2Vucyc7XG5leHBvcnQgKiBmcm9tICcuL25nbW9kdWxlL2F1dGguc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL25nbW9kdWxlL2h0dHAtYWRhcHRlcic7XG5leHBvcnQgKiBmcm9tICcuL25nbW9kdWxlL2F1dGguaW50ZXJjZXB0b3IuY2xhc3MnO1xuZXhwb3J0ICogZnJvbSAnLi9uZ21vZHVsZS9uYXV0aC5tb2R1bGUnO1xuXG4vLyBFeHBvcnQgZnVuY3Rpb25hbCBjb21wb25lbnRzIChmb3IgZmxleGliaWxpdHkgaW4gTmdNb2R1bGUgYXBwcyB0b28pXG5leHBvcnQgKiBmcm9tICcuL2xpYi9hdXRoLmludGVyY2VwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2F1dGguZ3VhcmQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc29jaWFsLXJlZGlyZWN0LWNhbGxiYWNrLmd1YXJkJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3JlY2FwdGNoYS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3JlY2FwdGNoYS1wcm92aWRlcic7XG4iXX0=
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { NAuthErrorCode, NAuthClientError, NAuthClient } from '@nauth-toolkit/client';
|
|
2
2
|
export * from '@nauth-toolkit/client';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { InjectionToken, Injectable, PLATFORM_ID, Inject, Optional, inject, NgModule } from '@angular/core';
|
|
4
|
+
import { InjectionToken, Injectable, PLATFORM_ID, Inject, Optional, inject, APP_INITIALIZER, NgModule, makeEnvironmentProviders } from '@angular/core';
|
|
5
5
|
import { firstValueFrom, BehaviorSubject, Subject, from, switchMap, of, map, catchError, throwError, finalize, shareReplay } from 'rxjs';
|
|
6
6
|
import { filter } from 'rxjs/operators';
|
|
7
7
|
import * as i1 from '@angular/common/http';
|
|
@@ -139,7 +139,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
139
139
|
/**
|
|
140
140
|
* Injection token for reCAPTCHA configuration
|
|
141
141
|
*/
|
|
142
|
-
const RECAPTCHA_CONFIG = new InjectionToken('RECAPTCHA_CONFIG'
|
|
142
|
+
const RECAPTCHA_CONFIG = new InjectionToken('RECAPTCHA_CONFIG', {
|
|
143
|
+
providedIn: 'root',
|
|
144
|
+
factory: () => undefined,
|
|
145
|
+
});
|
|
143
146
|
/**
|
|
144
147
|
* Google reCAPTCHA service for Angular applications.
|
|
145
148
|
*
|
|
@@ -184,6 +187,15 @@ class RecaptchaService {
|
|
|
184
187
|
this.platformId = platformId;
|
|
185
188
|
this.config = config;
|
|
186
189
|
this.platform = this.detectPlatform();
|
|
190
|
+
// Auto-preload script for v3/Enterprise so it's ready before first login/signup
|
|
191
|
+
// No-op when disabled, shouldSkip, or v2 (v2 renders on-demand)
|
|
192
|
+
if (this.config?.enabled && (this.config.version === 'v3' || this.config.version === 'enterprise')) {
|
|
193
|
+
if (!this.shouldSkip()) {
|
|
194
|
+
this.loadScript().catch(() => {
|
|
195
|
+
// Silently fail - execute() will handle errors when called
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
187
199
|
}
|
|
188
200
|
// ============================================================================
|
|
189
201
|
// Platform Detection
|
|
@@ -1895,7 +1907,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1895
1907
|
*
|
|
1896
1908
|
* Use this for NgModule-based apps (Angular 17+ with NgModule or legacy apps).
|
|
1897
1909
|
*
|
|
1898
|
-
* @example
|
|
1910
|
+
* @example Basic Setup
|
|
1899
1911
|
* ```typescript
|
|
1900
1912
|
* // app.module.ts
|
|
1901
1913
|
* import { NAuthModule } from '@nauth-toolkit/client-angular';
|
|
@@ -1910,35 +1922,67 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1910
1922
|
* })
|
|
1911
1923
|
* export class AppModule {}
|
|
1912
1924
|
* ```
|
|
1925
|
+
*
|
|
1926
|
+
* @example With reCAPTCHA Enterprise
|
|
1927
|
+
* ```typescript
|
|
1928
|
+
* NAuthModule.forRoot({
|
|
1929
|
+
* baseUrl: 'http://localhost:3000/auth',
|
|
1930
|
+
* tokenDelivery: 'cookies',
|
|
1931
|
+
* recaptcha: {
|
|
1932
|
+
* enabled: true,
|
|
1933
|
+
* version: 'enterprise',
|
|
1934
|
+
* siteKey: environment.recaptchaSiteKey,
|
|
1935
|
+
* action: 'login',
|
|
1936
|
+
* },
|
|
1937
|
+
* })
|
|
1938
|
+
* ```
|
|
1913
1939
|
*/
|
|
1914
1940
|
class NAuthModule {
|
|
1915
1941
|
static forRoot(config) {
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
{
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
const router = inject(Router, { optional: true });
|
|
1930
|
-
return new AuthService(config, httpAdapter, router ?? undefined);
|
|
1931
|
-
},
|
|
1932
|
-
deps: [AngularHttpAdapter],
|
|
1942
|
+
const providers = [
|
|
1943
|
+
{
|
|
1944
|
+
provide: NAUTH_CLIENT_CONFIG,
|
|
1945
|
+
useValue: config,
|
|
1946
|
+
},
|
|
1947
|
+
AngularHttpAdapter,
|
|
1948
|
+
{
|
|
1949
|
+
provide: AuthService,
|
|
1950
|
+
useFactory: (httpAdapter, recaptchaService) => {
|
|
1951
|
+
// Try to inject Router optionally - if not available, pass undefined
|
|
1952
|
+
// Router will be undefined if not provided (e.g., in apps without routing)
|
|
1953
|
+
const router = inject(Router, { optional: true });
|
|
1954
|
+
return new AuthService(config, httpAdapter, router ?? undefined, recaptchaService);
|
|
1933
1955
|
},
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1956
|
+
deps: [AngularHttpAdapter, [new Optional(), RecaptchaService]],
|
|
1957
|
+
},
|
|
1958
|
+
{
|
|
1959
|
+
provide: HTTP_INTERCEPTORS,
|
|
1960
|
+
useClass: AuthInterceptorClass,
|
|
1961
|
+
multi: true,
|
|
1962
|
+
},
|
|
1963
|
+
// Provide AuthGuard so it has access to NAUTH_CLIENT_CONFIG
|
|
1964
|
+
AuthGuard,
|
|
1965
|
+
];
|
|
1966
|
+
// Add reCAPTCHA providers if configured
|
|
1967
|
+
if (config.recaptcha?.enabled) {
|
|
1968
|
+
providers.push({
|
|
1969
|
+
provide: RECAPTCHA_CONFIG,
|
|
1970
|
+
// Cast because interface extends but they're compatible
|
|
1971
|
+
useValue: config.recaptcha,
|
|
1972
|
+
}, RecaptchaService, {
|
|
1973
|
+
provide: APP_INITIALIZER,
|
|
1974
|
+
useFactory: () => {
|
|
1975
|
+
// Force RecaptchaService instantiation at app startup so script preloads
|
|
1976
|
+
inject(RecaptchaService);
|
|
1977
|
+
// No-op - constructor already handles preload
|
|
1978
|
+
return () => { };
|
|
1938
1979
|
},
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1980
|
+
multi: true,
|
|
1981
|
+
});
|
|
1982
|
+
}
|
|
1983
|
+
return {
|
|
1984
|
+
ngModule: NAuthModule,
|
|
1985
|
+
providers,
|
|
1942
1986
|
};
|
|
1943
1987
|
}
|
|
1944
1988
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
@@ -2108,6 +2152,56 @@ const socialRedirectCallbackGuard = async () => {
|
|
|
2108
2152
|
return router.isSuccessRedirectDisabled({ source: 'social', appState: appState ?? undefined });
|
|
2109
2153
|
};
|
|
2110
2154
|
|
|
2155
|
+
/**
|
|
2156
|
+
* Provides reCAPTCHA configuration and automatic script preloading.
|
|
2157
|
+
*
|
|
2158
|
+
* Sets up `RECAPTCHA_CONFIG` and forces `RecaptchaService` instantiation at app
|
|
2159
|
+
* startup so the reCAPTCHA script preloads before the user clicks login/signup.
|
|
2160
|
+
*
|
|
2161
|
+
* @param config - reCAPTCHA configuration (enabled, version, siteKey, action)
|
|
2162
|
+
* @returns Environment providers for reCAPTCHA
|
|
2163
|
+
*
|
|
2164
|
+
* @example
|
|
2165
|
+
* ```typescript
|
|
2166
|
+
* export const appConfig: ApplicationConfig = {
|
|
2167
|
+
* providers: [
|
|
2168
|
+
* provideRecaptcha({
|
|
2169
|
+
* enabled: true,
|
|
2170
|
+
* version: 'enterprise',
|
|
2171
|
+
* siteKey: environment.recaptchaSiteKey,
|
|
2172
|
+
* action: 'login',
|
|
2173
|
+
* }),
|
|
2174
|
+
* // ... other providers
|
|
2175
|
+
* ],
|
|
2176
|
+
* };
|
|
2177
|
+
* ```
|
|
2178
|
+
*/
|
|
2179
|
+
function provideRecaptcha(config) {
|
|
2180
|
+
return makeEnvironmentProviders([
|
|
2181
|
+
{
|
|
2182
|
+
provide: RECAPTCHA_CONFIG,
|
|
2183
|
+
useValue: config,
|
|
2184
|
+
},
|
|
2185
|
+
RecaptchaService,
|
|
2186
|
+
{
|
|
2187
|
+
provide: APP_INITIALIZER,
|
|
2188
|
+
useFactory: () => {
|
|
2189
|
+
const recaptcha = inject(RecaptchaService);
|
|
2190
|
+
// Return initialization function that ensures script starts loading
|
|
2191
|
+
return () => {
|
|
2192
|
+
// Trigger script load (fire-and-forget, don't block app startup)
|
|
2193
|
+
if (config.enabled && (config.version === 'v3' || config.version === 'enterprise')) {
|
|
2194
|
+
recaptcha.loadScript().catch(() => {
|
|
2195
|
+
// Silent fail - execute() will retry when called
|
|
2196
|
+
});
|
|
2197
|
+
}
|
|
2198
|
+
};
|
|
2199
|
+
},
|
|
2200
|
+
multi: true,
|
|
2201
|
+
},
|
|
2202
|
+
]);
|
|
2203
|
+
}
|
|
2204
|
+
|
|
2111
2205
|
/**
|
|
2112
2206
|
* Public API Surface of @nauth-toolkit/client-angular (NgModule)
|
|
2113
2207
|
*
|
|
@@ -2120,5 +2214,5 @@ const socialRedirectCallbackGuard = async () => {
|
|
|
2120
2214
|
* Generated bundle index. Do not edit.
|
|
2121
2215
|
*/
|
|
2122
2216
|
|
|
2123
|
-
export { AngularHttpAdapter, AuthGuard, AuthInterceptor, AuthInterceptorClass, AuthService, NAUTH_CLIENT_CONFIG, NAuthModule, RECAPTCHA_CONFIG, RecaptchaService, authGuard, authInterceptor, socialRedirectCallbackGuard };
|
|
2217
|
+
export { AngularHttpAdapter, AuthGuard, AuthInterceptor, AuthInterceptorClass, AuthService, NAUTH_CLIENT_CONFIG, NAuthModule, RECAPTCHA_CONFIG, RecaptchaService, authGuard, authInterceptor, provideRecaptcha, socialRedirectCallbackGuard };
|
|
2124
2218
|
//# sourceMappingURL=nauth-toolkit-client-angular.mjs.map
|