ngx-oauth 4.2.3 → 7.0.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.
Files changed (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +17 -16
  3. package/components/index.d.ts +1 -0
  4. package/components/{login/oauth-login.component.d.ts → o-auth-login.component.d.ts} +7 -9
  5. package/config/index.d.ts +17 -0
  6. package/esm2022/components/index.mjs +2 -0
  7. package/esm2022/components/o-auth-login.component.mjs +261 -0
  8. package/esm2022/config/index.mjs +32 -0
  9. package/esm2022/index.mjs +8 -0
  10. package/esm2022/models/index.mjs +16 -0
  11. package/esm2022/services/index.mjs +5 -0
  12. package/esm2022/services/o-auth-http-client.mjs +15 -0
  13. package/esm2022/services/o-auth-token.service.mjs +80 -0
  14. package/esm2022/services/o-auth.interceptor.mjs +43 -0
  15. package/esm2022/services/o-auth.service.mjs +302 -0
  16. package/fesm2022/ngx-oauth.mjs +731 -0
  17. package/fesm2022/ngx-oauth.mjs.map +1 -0
  18. package/index.d.ts +3 -5
  19. package/models/index.d.ts +3 -22
  20. package/package.json +10 -18
  21. package/services/index.d.ts +4 -0
  22. package/services/o-auth-http-client.d.ts +6 -0
  23. package/services/{token.service.d.ts → o-auth-token.service.d.ts} +5 -6
  24. package/services/o-auth.interceptor.d.ts +2 -0
  25. package/services/{oauth.service.d.ts → o-auth.service.d.ts} +5 -5
  26. package/esm2020/components/login/oauth-login.component.mjs +0 -123
  27. package/esm2020/index.mjs +0 -10
  28. package/esm2020/models/index.mjs +0 -47
  29. package/esm2020/oauth.module.mjs +0 -120
  30. package/esm2020/services/oauth.interceptor.mjs +0 -53
  31. package/esm2020/services/oauth.service.mjs +0 -300
  32. package/esm2020/services/token.service.mjs +0 -83
  33. package/fesm2015/ngx-oauth.mjs +0 -642
  34. package/fesm2015/ngx-oauth.mjs.map +0 -1
  35. package/fesm2020/ngx-oauth.mjs +0 -701
  36. package/fesm2020/ngx-oauth.mjs.map +0 -1
  37. package/oauth.module.d.ts +0 -14
  38. package/services/oauth.interceptor.d.ts +0 -13
  39. /package/{esm2020 → esm2022}/ngx-oauth.mjs +0 -0
@@ -1,83 +0,0 @@
1
- var _OAuthTokenService_token$;
2
- import { __classPrivateFieldGet } from "tslib";
3
- import { Inject, Injectable } from '@angular/core';
4
- import { BehaviorSubject, distinctUntilChanged, of, switchMap } from 'rxjs';
5
- import { HEADER_APPLICATION, OAUTH_HTTP_CLIENT } from '../models';
6
- import { catchError, map, shareReplay } from 'rxjs/operators';
7
- import { HttpParams } from '@angular/common/http';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "../models";
10
- import * as i2 from "@angular/common/http";
11
- const isExpiredToken = (token) => token && token.expires && Date.now() > token.expires || false;
12
- export class OAuthTokenService {
13
- constructor(authConfig, http, zone) {
14
- this.authConfig = authConfig;
15
- this.http = http;
16
- this.zone = zone;
17
- _OAuthTokenService_token$.set(this, new BehaviorSubject(this.saved));
18
- this.token$ = __classPrivateFieldGet(this, _OAuthTokenService_token$, "f").pipe(distinctUntilChanged((p, c) => JSON.stringify(p || null) === JSON.stringify(c || null)), shareReplay(1), switchMap(token => !isExpiredToken(token) && of(token) || this.refreshToken(token)));
19
- this.type$ = this.token$.pipe(map(token => token?.type), shareReplay(1));
20
- this.accessToken$ = this.token$.pipe(map(token => token?.access_token), shareReplay(1));
21
- }
22
- get token() {
23
- return __classPrivateFieldGet(this, _OAuthTokenService_token$, "f").value;
24
- }
25
- set token(token) {
26
- const expiresIn = Number(token.expires_in) || 0;
27
- const result = {
28
- ...token,
29
- ...expiresIn && { expires: Date.now() + expiresIn * 1000 } || {}
30
- };
31
- this.saved = result;
32
- __classPrivateFieldGet(this, _OAuthTokenService_token$, "f").next(result);
33
- }
34
- get saved() {
35
- const { storageKey, storage } = this.authConfig;
36
- return storageKey && storage && storage[storageKey] && JSON.parse(storage[storageKey]) || {};
37
- }
38
- set saved(token) {
39
- const { storageKey, storage } = this.authConfig;
40
- if (storage && storageKey) {
41
- if (token) {
42
- storage[storageKey] = JSON.stringify(token);
43
- }
44
- else {
45
- delete storage[storageKey];
46
- }
47
- }
48
- }
49
- refreshToken(token) {
50
- const { tokenPath, clientId, clientSecret, scope } = this.authConfig.config;
51
- const { refresh_token } = token || {};
52
- return tokenPath && refresh_token && this.http.post(tokenPath, new HttpParams({
53
- fromObject: {
54
- client_id: clientId,
55
- ...clientSecret && { client_secret: clientSecret } || {},
56
- grant_type: 'refresh_token',
57
- refresh_token,
58
- ...scope && { scope } || {},
59
- }
60
- }), {
61
- headers: HEADER_APPLICATION
62
- }).pipe(catchError(() => {
63
- this.token = {};
64
- return of(this.token);
65
- }), map(token => {
66
- this.token = {
67
- ...this.token,
68
- ...token
69
- };
70
- return this.token;
71
- })) || of(token);
72
- }
73
- }
74
- _OAuthTokenService_token$ = new WeakMap();
75
- OAuthTokenService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthTokenService, deps: [{ token: i1.OAuthConfig }, { token: OAUTH_HTTP_CLIENT }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
76
- OAuthTokenService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthTokenService });
77
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthTokenService, decorators: [{
78
- type: Injectable
79
- }], ctorParameters: function () { return [{ type: i1.OAuthConfig }, { type: i2.HttpClient, decorators: [{
80
- type: Inject,
81
- args: [OAUTH_HTTP_CLIENT]
82
- }] }, { type: i0.NgZone }]; } });
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1vYXV0aC9zcmMvc2VydmljZXMvdG9rZW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBQyxlQUFlLEVBQUUsb0JBQW9CLEVBQWMsRUFBRSxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN0RixPQUFPLEVBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQTBCLE1BQU0sV0FBVyxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVELE9BQU8sRUFBYSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQzs7OztBQUU1RCxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWtCLEVBQUUsRUFBRSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQztBQUc3RyxNQUFNLE9BQU8saUJBQWlCO0lBaUI1QixZQUFzQixVQUF1QixFQUNJLElBQWdCLEVBQzNDLElBQVk7UUFGWixlQUFVLEdBQVYsVUFBVSxDQUFhO1FBQ0ksU0FBSSxHQUFKLElBQUksQ0FBWTtRQUMzQyxTQUFJLEdBQUosSUFBSSxDQUFRO1FBakJsQyxvQ0FBVSxJQUFJLGVBQWUsQ0FBYSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUM7UUFDdEQsV0FBTSxHQUFHLHVCQUFBLElBQUksaUNBQVEsQ0FBQyxJQUFJLENBQ3hCLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksSUFBSSxD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RUFBRTtZQUNGLE9BQU8sRUFBRSxrQkFBa0I7U0FDNUIsQ0FBQyxDQUFDLElBQUksQ0FDTCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDaEIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNWLElBQUksQ0FBQyxLQUFLLEdBQUc7Z0JBQ1gsR0FBRyxJQUFJLENBQUMsS0FBSztnQkFDYixHQUFHLEtBQUs7YUFDVCxDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUNILElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pCLENBQUM7Ozs4R0E5RVUsaUJBQWlCLDZDQWtCUixpQkFBaUI7a0hBbEIxQixpQkFBaUI7MkZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVTs7MEJBbUJJLE1BQU07MkJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIE5nWm9uZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIE9ic2VydmFibGUsIG9mLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtIRUFERVJfQVBQTElDQVRJT04sIE9BVVRIX0hUVFBfQ0xJRU5ULCBPQXV0aENvbmZpZywgT0F1dGhUb2tlbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgbWFwLCBzaGFyZVJlcGxheX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwUGFyYW1zfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbmNvbnN0IGlzRXhwaXJlZFRva2VuID0gKHRva2VuPzogT0F1dGhUb2tlbikgPT4gdG9rZW4gJiYgdG9rZW4uZXhwaXJlcyAmJiBEYXRlLm5vdygpID4gdG9rZW4uZXhwaXJlcyB8fCBmYWxzZTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9BdXRoVG9rZW5TZXJ2aWNlIHtcblxuICAjdG9rZW4kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPQXV0aFRva2VuPih0aGlzLnNhdmVkKTtcbiAgdG9rZW4kID0gdGhpcy4jdG9rZW4kLnBpcGUoXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHAsIGMpID0+IEpTT04uc3RyaW5naWZ5KHAgfHwgbnVsbCkgPT09IEpTT04uc3RyaW5naWZ5KGMgfHwgbnVsbCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgIHN3aXRjaE1hcCh0b2tlbiA9PiAhaXNFeHBpcmVkVG9rZW4odG9rZW4pICYmIG9mKHRva2VuKSB8fCB0aGlzLnJlZnJlc2hUb2tlbih0b2tlbikpLFxuICApO1xuICB0eXBlJCA9IHRoaXMudG9rZW4kLnBpcGUoXG4gICAgbWFwKHRva2VuID0+IHRva2VuPy50eXBlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuICBhY2Nlc3NUb2tlbiQgPSB0aGlzLnRva2VuJC5waXBlKFxuICAgIG1hcCh0b2tlbiA9PiB0b2tlbj8uYWNjZXNzX3Rva2VuKSxcbiAgICBzaGFyZVJlcGxheSgxKSxcbiAgKTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgYXV0aENvbmZpZzogT0F1dGhDb25maWcsXG4gICAgICAgICAgICAgIEBJbmplY3QoT0FVVEhfSFRUUF9DTElFTlQpIHByb3RlY3RlZCBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgem9uZTogTmdab25lKSB7XG4gIH1cblxuICBnZXQgdG9rZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Rva2VuJC52YWx1ZTtcbiAgfVxuXG4gIHNldCB0b2tlbih0b2tlbikge1xuICAgIGNvbnN0IGV4cGlyZXNJbiA9IE51bWJlcih0b2tlbi5leHBpcmVzX2luKSB8fCAwO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIC4uLnRva2VuLFxuICAgICAgLi4uZXhwaXJlc0luICYmIHtleHBpcmVzOiBEYXRlLm5vdygpICsgZXhwaXJlc0luICogMTAwMH0gfHwge31cbiAgICB9O1xuICAgIHRoaXMuc2F2ZWQgPSByZXN1bHQ7XG4gICAgdGhpcy4jdG9rZW4kLm5leHQocmVzdWx0KTtcbiAgfVxuXG4gIGdldCBzYXZlZCgpIHtcbiAgICBjb25zdCB7c3RvcmFnZUtleSwgc3RvcmFnZX0gPSB0aGlzLmF1dGhDb25maWc7XG4gICAgcmV0dXJuIHN0b3JhZ2VLZXkgJiYgc3RvcmFnZSAmJiBzdG9yYWdlW3N0b3JhZ2VLZXldICYmIEpTT04ucGFyc2Uoc3RvcmFnZVtzdG9yYWdlS2V5XSkgfHwge307XG4gIH1cblxuICBzZXQgc2F2ZWQodG9rZW46IE9BdXRoVG9rZW4pIHtcbiAgICBjb25zdCB7c3RvcmFnZUtleSwgc3RvcmFnZX0gPSB0aGlzLmF1dGhDb25maWc7XG4gICAgaWYgKHN0b3JhZ2UgJiYgc3RvcmFnZUtleSkge1xuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIHN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBKU09OLnN0cmluZ2lmeSh0b2tlbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgc3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVmcmVzaFRva2VuKHRva2VuPzogT0F1dGhUb2tlbik6IE9ic2VydmFibGU8T0F1dGhUb2tlbj4ge1xuICAgIGNvbnN0IHt0b2tlblBhdGgsIGNsaWVudElkLCBjbGllbnRTZWNyZXQsIHNjb3BlfSA9IHRoaXMuYXV0aENvbmZpZy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHtyZWZyZXNoX3Rva2VufSA9IHRva2VuIHx8IHt9O1xuICAgIHJldHVybiB0b2tlblBhdGggJiYgcmVmcmVzaF90b2tlbiAmJiB0aGlzLmh0dHAucG9zdDxPQXV0aFRva2VuPih0b2tlblBhdGgsIG5ldyBIdHRwUGFyYW1zKHtcbiAgICAgIGZyb21PYmplY3Q6IHtcbiAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcbiAgICAgICAgLi4uY2xpZW50U2VjcmV0ICYmIHtjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXR9IHx8IHt9LFxuICAgICAgICBncmFudF90eXBlOiAncmVmcmVzaF90b2tlbicsXG4gICAgICAgIHJlZnJlc2hfdG9rZW4sXG4gICAgICAgIC4uLnNjb3BlICYmIHtzY29wZX0gfHwge30sXG4gICAgICB9XG4gICAgfSksIHtcbiAgICAgIGhlYWRlcnM6IEhFQURFUl9BUFBMSUNBVElPTlxuICAgIH0pLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgdGhpcy50b2tlbiA9IHt9O1xuICAgICAgICByZXR1cm4gb2YodGhpcy50b2tlbik7XG4gICAgICB9KSxcbiAgICAgIG1hcCh0b2tlbiA9PiB7XG4gICAgICAgIHRoaXMudG9rZW4gPSB7XG4gICAgICAgICAgLi4udGhpcy50b2tlbixcbiAgICAgICAgICAuLi50b2tlblxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbjtcbiAgICAgIH0pXG4gICAgKSB8fCBvZih0b2tlbik7XG4gIH1cbn1cbiJdfQ==