@23blocks/angular 0.2.1 → 1.0.1
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/dist/lib/authentication/authentication.service.js +89 -10
- package/dist/lib/authentication/authentication.service.js.map +1 -1
- package/dist/lib/index.js +8 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/simple-providers.js +400 -0
- package/dist/lib/simple-providers.js.map +1 -0
- package/package.json +2 -1
|
@@ -1,22 +1,50 @@
|
|
|
1
1
|
import { _ as _ts_decorate } from "@swc/helpers/_/_ts_decorate";
|
|
2
2
|
import { _ as _ts_metadata } from "@swc/helpers/_/_ts_metadata";
|
|
3
3
|
import { _ as _ts_param } from "@swc/helpers/_/_ts_param";
|
|
4
|
-
import { Injectable, Inject } from '@angular/core';
|
|
5
|
-
import { from } from 'rxjs';
|
|
4
|
+
import { Injectable, Inject, Optional } from '@angular/core';
|
|
5
|
+
import { from, tap } from 'rxjs';
|
|
6
6
|
import { createAuthenticationBlock } from '@23blocks/block-authentication';
|
|
7
7
|
import { TRANSPORT, AUTHENTICATION_CONFIG } from '../tokens.js';
|
|
8
|
+
import { TOKEN_MANAGER, SIMPLE_CONFIG } from '../simple-providers.js';
|
|
8
9
|
export class AuthenticationService {
|
|
10
|
+
/**
|
|
11
|
+
* Check if using simplified API with automatic token management
|
|
12
|
+
*/ get isTokenMode() {
|
|
13
|
+
var _this_simpleConfig;
|
|
14
|
+
return this.tokenManager !== null && ((_this_simpleConfig = this.simpleConfig) == null ? void 0 : _this_simpleConfig.authMode) !== 'cookie';
|
|
15
|
+
}
|
|
9
16
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
10
17
|
// Auth Service
|
|
11
18
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
12
|
-
|
|
13
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Sign in with email and password.
|
|
21
|
+
* When using simplified API (provideBlocks23), tokens are stored automatically.
|
|
22
|
+
*/ signIn(request) {
|
|
23
|
+
return from(this.block.auth.signIn(request)).pipe(tap((response)=>{
|
|
24
|
+
if (this.isTokenMode && this.tokenManager && response.accessToken) {
|
|
25
|
+
this.tokenManager.setTokens(response.accessToken, response.refreshToken);
|
|
26
|
+
}
|
|
27
|
+
}));
|
|
14
28
|
}
|
|
15
|
-
|
|
16
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Sign up a new user.
|
|
31
|
+
* When using simplified API, tokens are stored automatically if returned.
|
|
32
|
+
*/ signUp(request) {
|
|
33
|
+
return from(this.block.auth.signUp(request)).pipe(tap((response)=>{
|
|
34
|
+
if (this.isTokenMode && this.tokenManager && response.accessToken) {
|
|
35
|
+
this.tokenManager.setTokens(response.accessToken);
|
|
36
|
+
}
|
|
37
|
+
}));
|
|
17
38
|
}
|
|
18
|
-
|
|
19
|
-
|
|
39
|
+
/**
|
|
40
|
+
* Sign out the current user.
|
|
41
|
+
* When using simplified API, tokens are cleared automatically.
|
|
42
|
+
*/ signOut() {
|
|
43
|
+
return from(this.block.auth.signOut()).pipe(tap(()=>{
|
|
44
|
+
if (this.isTokenMode && this.tokenManager) {
|
|
45
|
+
this.tokenManager.clearTokens();
|
|
46
|
+
}
|
|
47
|
+
}));
|
|
20
48
|
}
|
|
21
49
|
requestPasswordReset(request) {
|
|
22
50
|
return from(this.block.auth.requestPasswordReset(request));
|
|
@@ -85,6 +113,49 @@ export class AuthenticationService {
|
|
|
85
113
|
return from(this.block.apiKeys.revoke(id));
|
|
86
114
|
}
|
|
87
115
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
116
|
+
// Token Management (only applicable with provideBlocks23)
|
|
117
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
118
|
+
/**
|
|
119
|
+
* Get the current access token (token mode only).
|
|
120
|
+
* Returns null if using cookie mode or no token is stored.
|
|
121
|
+
*/ getAccessToken() {
|
|
122
|
+
var _this_tokenManager;
|
|
123
|
+
var _this_tokenManager_getAccessToken;
|
|
124
|
+
return (_this_tokenManager_getAccessToken = (_this_tokenManager = this.tokenManager) == null ? void 0 : _this_tokenManager.getAccessToken()) != null ? _this_tokenManager_getAccessToken : null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get the current refresh token (token mode only).
|
|
128
|
+
* Returns null if using cookie mode or no token is stored.
|
|
129
|
+
*/ getRefreshToken() {
|
|
130
|
+
var _this_tokenManager;
|
|
131
|
+
var _this_tokenManager_getRefreshToken;
|
|
132
|
+
return (_this_tokenManager_getRefreshToken = (_this_tokenManager = this.tokenManager) == null ? void 0 : _this_tokenManager.getRefreshToken()) != null ? _this_tokenManager_getRefreshToken : null;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Manually set tokens (token mode only).
|
|
136
|
+
* Useful for SSR hydration or external auth flows.
|
|
137
|
+
*/ setTokens(accessToken, refreshToken) {
|
|
138
|
+
var _this_tokenManager;
|
|
139
|
+
(_this_tokenManager = this.tokenManager) == null ? void 0 : _this_tokenManager.setTokens(accessToken, refreshToken);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Clear stored tokens.
|
|
143
|
+
*/ clearTokens() {
|
|
144
|
+
var _this_tokenManager;
|
|
145
|
+
(_this_tokenManager = this.tokenManager) == null ? void 0 : _this_tokenManager.clearTokens();
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Check if user is likely authenticated.
|
|
149
|
+
* In token mode: checks if token exists.
|
|
150
|
+
* In cookie mode: always returns null (use validateToken instead).
|
|
151
|
+
*/ isAuthenticated() {
|
|
152
|
+
var _this_simpleConfig;
|
|
153
|
+
if (!this.tokenManager || ((_this_simpleConfig = this.simpleConfig) == null ? void 0 : _this_simpleConfig.authMode) === 'cookie') {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
return !!this.tokenManager.getAccessToken();
|
|
157
|
+
}
|
|
158
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
88
159
|
// Direct Block Access (for advanced usage)
|
|
89
160
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
90
161
|
/**
|
|
@@ -93,8 +164,10 @@ export class AuthenticationService {
|
|
|
93
164
|
*/ get rawBlock() {
|
|
94
165
|
return this.block;
|
|
95
166
|
}
|
|
96
|
-
constructor(transport, config){
|
|
167
|
+
constructor(transport, config, tokenManager, simpleConfig){
|
|
97
168
|
this.block = createAuthenticationBlock(transport, config);
|
|
169
|
+
this.tokenManager = tokenManager;
|
|
170
|
+
this.simpleConfig = simpleConfig;
|
|
98
171
|
}
|
|
99
172
|
}
|
|
100
173
|
AuthenticationService = _ts_decorate([
|
|
@@ -103,10 +176,16 @@ AuthenticationService = _ts_decorate([
|
|
|
103
176
|
}),
|
|
104
177
|
_ts_param(0, Inject(TRANSPORT)),
|
|
105
178
|
_ts_param(1, Inject(AUTHENTICATION_CONFIG)),
|
|
179
|
+
_ts_param(2, Optional()),
|
|
180
|
+
_ts_param(2, Inject(TOKEN_MANAGER)),
|
|
181
|
+
_ts_param(3, Optional()),
|
|
182
|
+
_ts_param(3, Inject(SIMPLE_CONFIG)),
|
|
106
183
|
_ts_metadata("design:type", Function),
|
|
107
184
|
_ts_metadata("design:paramtypes", [
|
|
108
185
|
typeof Transport === "undefined" ? Object : Transport,
|
|
109
|
-
typeof AuthenticationBlockConfig === "undefined" ? Object : AuthenticationBlockConfig
|
|
186
|
+
typeof AuthenticationBlockConfig === "undefined" ? Object : AuthenticationBlockConfig,
|
|
187
|
+
Object,
|
|
188
|
+
Object
|
|
110
189
|
])
|
|
111
190
|
], AuthenticationService);
|
|
112
191
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/authentication/authentication.service.ts"],"sourcesContent":["import { Injectable, Inject } from '@angular/core';\nimport { Observable, from } from 'rxjs';\nimport type { Transport } from '@23blocks/contracts';\nimport {\n createAuthenticationBlock,\n type AuthenticationBlock,\n type AuthenticationBlockConfig,\n type User,\n type Role,\n type Permission,\n type SignInRequest,\n type SignInResponse,\n type SignUpRequest,\n type SignUpResponse,\n type PasswordResetRequest,\n type PasswordUpdateRequest,\n type TokenValidationResponse,\n type ApiKey,\n type ApiKeyWithSecret,\n type CreateApiKeyRequest,\n type UpdateApiKeyRequest,\n type UpdateUserRequest,\n type CreateRoleRequest,\n type UpdateRoleRequest,\n} from '@23blocks/block-authentication';\nimport { TRANSPORT, AUTHENTICATION_CONFIG } from '../tokens.js';\n\n/**\n * Angular service wrapping the Authentication block.\n * Converts Promise-based APIs to RxJS Observables.\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class LoginComponent {\n * constructor(private auth: AuthenticationService) {}\n *\n * login(email: string, password: string) {\n * this.auth.signIn({ email, password }).subscribe({\n * next: (response) => console.log('Signed in:', response.user),\n * error: (err) => console.error('Failed:', err),\n * });\n * }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthenticationService {\n private readonly block: AuthenticationBlock;\n\n constructor(\n @Inject(TRANSPORT) transport: Transport,\n @Inject(AUTHENTICATION_CONFIG) config: AuthenticationBlockConfig\n ) {\n this.block = createAuthenticationBlock(transport, config);\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Auth Service\n // ─────────────────────────────────────────────────────────────────────────────\n\n signIn(request: SignInRequest): Observable<SignInResponse> {\n return from(this.block.auth.signIn(request));\n }\n\n signUp(request: SignUpRequest): Observable<SignUpResponse> {\n return from(this.block.auth.signUp(request));\n }\n\n signOut(): Observable<void> {\n return from(this.block.auth.signOut());\n }\n\n requestPasswordReset(request: PasswordResetRequest): Observable<void> {\n return from(this.block.auth.requestPasswordReset(request));\n }\n\n updatePassword(request: PasswordUpdateRequest): Observable<void> {\n return from(this.block.auth.updatePassword(request));\n }\n\n validateToken(token: string): Observable<TokenValidationResponse> {\n return from(this.block.auth.validateToken(token));\n }\n\n getCurrentUser(): Observable<User | null> {\n return from(this.block.auth.getCurrentUser());\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Users Service\n // ─────────────────────────────────────────────────────────────────────────────\n\n listUsers(params?: { page?: number; perPage?: number }): Observable<User[]> {\n return from(this.block.users.list(params));\n }\n\n getUser(id: string): Observable<User> {\n return from(this.block.users.get(id));\n }\n\n updateUser(id: string, request: UpdateUserRequest): Observable<User> {\n return from(this.block.users.update(id, request));\n }\n\n deleteUser(id: string): Observable<void> {\n return from(this.block.users.delete(id));\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Roles Service\n // ─────────────────────────────────────────────────────────────────────────────\n\n listRoles(): Observable<Role[]> {\n return from(this.block.roles.list());\n }\n\n getRole(id: string): Observable<Role> {\n return from(this.block.roles.get(id));\n }\n\n createRole(request: CreateRoleRequest): Observable<Role> {\n return from(this.block.roles.create(request));\n }\n\n updateRole(id: string, request: UpdateRoleRequest): Observable<Role> {\n return from(this.block.roles.update(id, request));\n }\n\n deleteRole(id: string): Observable<void> {\n return from(this.block.roles.delete(id));\n }\n\n listPermissions(): Observable<Permission[]> {\n return from(this.block.roles.listPermissions());\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // API Keys Service\n // ─────────────────────────────────────────────────────────────────────────────\n\n listApiKeys(): Observable<ApiKey[]> {\n return from(this.block.apiKeys.list());\n }\n\n getApiKey(id: string): Observable<ApiKey> {\n return from(this.block.apiKeys.get(id));\n }\n\n createApiKey(request: CreateApiKeyRequest): Observable<ApiKeyWithSecret> {\n return from(this.block.apiKeys.create(request));\n }\n\n updateApiKey(id: string, request: UpdateApiKeyRequest): Observable<ApiKey> {\n return from(this.block.apiKeys.update(id, request));\n }\n\n revokeApiKey(id: string): Observable<void> {\n return from(this.block.apiKeys.revoke(id));\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Direct Block Access (for advanced usage)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Access the underlying block for advanced operations\n * Use this when you need access to services not wrapped by this Angular service\n */\n get rawBlock(): AuthenticationBlock {\n return this.block;\n }\n}\n"],"names":["Injectable","Inject","from","createAuthenticationBlock","TRANSPORT","AUTHENTICATION_CONFIG","AuthenticationService","signIn","request","block","auth","signUp","signOut","requestPasswordReset","updatePassword","validateToken","token","getCurrentUser","listUsers","params","users","list","getUser","id","get","updateUser","update","deleteUser","delete","listRoles","roles","getRole","createRole","create","updateRole","deleteRole","listPermissions","listApiKeys","apiKeys","getApiKey","createApiKey","updateApiKey","revokeApiKey","revoke","rawBlock","constructor","transport","config","providedIn"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/authentication/authentication.service.ts"],"sourcesContent":["import { Injectable, Inject, Optional } from '@angular/core';\nimport { Observable, from, tap } from 'rxjs';\nimport type { Transport } from '@23blocks/contracts';\nimport {\n createAuthenticationBlock,\n type AuthenticationBlock,\n type AuthenticationBlockConfig,\n type User,\n type Role,\n type Permission,\n type SignInRequest,\n type SignInResponse,\n type SignUpRequest,\n type SignUpResponse,\n type PasswordResetRequest,\n type PasswordUpdateRequest,\n type TokenValidationResponse,\n type ApiKey,\n type ApiKeyWithSecret,\n type CreateApiKeyRequest,\n type UpdateApiKeyRequest,\n type UpdateUserRequest,\n type CreateRoleRequest,\n type UpdateRoleRequest,\n} from '@23blocks/block-authentication';\nimport { TRANSPORT, AUTHENTICATION_CONFIG } from '../tokens.js';\nimport { TOKEN_MANAGER, SIMPLE_CONFIG, type TokenManagerService, type Simple23BlocksConfig } from '../simple-providers.js';\n\n/**\n * Angular service wrapping the Authentication block.\n * Converts Promise-based APIs to RxJS Observables.\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class LoginComponent {\n * constructor(private auth: AuthenticationService) {}\n *\n * login(email: string, password: string) {\n * this.auth.signIn({ email, password }).subscribe({\n * next: (response) => console.log('Signed in:', response.user),\n * error: (err) => console.error('Failed:', err),\n * });\n * }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthenticationService {\n private readonly block: AuthenticationBlock;\n private readonly tokenManager: TokenManagerService | null;\n private readonly simpleConfig: Simple23BlocksConfig | null;\n\n constructor(\n @Inject(TRANSPORT) transport: Transport,\n @Inject(AUTHENTICATION_CONFIG) config: AuthenticationBlockConfig,\n @Optional() @Inject(TOKEN_MANAGER) tokenManager: TokenManagerService | null,\n @Optional() @Inject(SIMPLE_CONFIG) simpleConfig: Simple23BlocksConfig | null\n ) {\n this.block = createAuthenticationBlock(transport, config);\n this.tokenManager = tokenManager;\n this.simpleConfig = simpleConfig;\n }\n\n /**\n * Check if using simplified API with automatic token management\n */\n private get isTokenMode(): boolean {\n return this.tokenManager !== null && this.simpleConfig?.authMode !== 'cookie';\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Auth Service\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Sign in with email and password.\n * When using simplified API (provideBlocks23), tokens are stored automatically.\n */\n signIn(request: SignInRequest): Observable<SignInResponse> {\n return from(this.block.auth.signIn(request)).pipe(\n tap((response) => {\n if (this.isTokenMode && this.tokenManager && response.accessToken) {\n this.tokenManager.setTokens(response.accessToken, response.refreshToken);\n }\n })\n );\n }\n\n /**\n * Sign up a new user.\n * When using simplified API, tokens are stored automatically if returned.\n */\n signUp(request: SignUpRequest): Observable<SignUpResponse> {\n return from(this.block.auth.signUp(request)).pipe(\n tap((response) => {\n if (this.isTokenMode && this.tokenManager && response.accessToken) {\n this.tokenManager.setTokens(response.accessToken);\n }\n })\n );\n }\n\n /**\n * Sign out the current user.\n * When using simplified API, tokens are cleared automatically.\n */\n signOut(): Observable<void> {\n return from(this.block.auth.signOut()).pipe(\n tap(() => {\n if (this.isTokenMode && this.tokenManager) {\n this.tokenManager.clearTokens();\n }\n })\n );\n }\n\n requestPasswordReset(request: PasswordResetRequest): Observable<void> {\n return from(this.block.auth.requestPasswordReset(request));\n }\n\n updatePassword(request: PasswordUpdateRequest): Observable<void> {\n return from(this.block.auth.updatePassword(request));\n }\n\n validateToken(token: string): Observable<TokenValidationResponse> {\n return from(this.block.auth.validateToken(token));\n }\n\n getCurrentUser(): Observable<User | null> {\n return from(this.block.auth.getCurrentUser());\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Users Service\n // ─────────────────────────────────────────────────────────────────────────────\n\n listUsers(params?: { page?: number; perPage?: number }): Observable<User[]> {\n return from(this.block.users.list(params));\n }\n\n getUser(id: string): Observable<User> {\n return from(this.block.users.get(id));\n }\n\n updateUser(id: string, request: UpdateUserRequest): Observable<User> {\n return from(this.block.users.update(id, request));\n }\n\n deleteUser(id: string): Observable<void> {\n return from(this.block.users.delete(id));\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Roles Service\n // ─────────────────────────────────────────────────────────────────────────────\n\n listRoles(): Observable<Role[]> {\n return from(this.block.roles.list());\n }\n\n getRole(id: string): Observable<Role> {\n return from(this.block.roles.get(id));\n }\n\n createRole(request: CreateRoleRequest): Observable<Role> {\n return from(this.block.roles.create(request));\n }\n\n updateRole(id: string, request: UpdateRoleRequest): Observable<Role> {\n return from(this.block.roles.update(id, request));\n }\n\n deleteRole(id: string): Observable<void> {\n return from(this.block.roles.delete(id));\n }\n\n listPermissions(): Observable<Permission[]> {\n return from(this.block.roles.listPermissions());\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // API Keys Service\n // ─────────────────────────────────────────────────────────────────────────────\n\n listApiKeys(): Observable<ApiKey[]> {\n return from(this.block.apiKeys.list());\n }\n\n getApiKey(id: string): Observable<ApiKey> {\n return from(this.block.apiKeys.get(id));\n }\n\n createApiKey(request: CreateApiKeyRequest): Observable<ApiKeyWithSecret> {\n return from(this.block.apiKeys.create(request));\n }\n\n updateApiKey(id: string, request: UpdateApiKeyRequest): Observable<ApiKey> {\n return from(this.block.apiKeys.update(id, request));\n }\n\n revokeApiKey(id: string): Observable<void> {\n return from(this.block.apiKeys.revoke(id));\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Token Management (only applicable with provideBlocks23)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Get the current access token (token mode only).\n * Returns null if using cookie mode or no token is stored.\n */\n getAccessToken(): string | null {\n return this.tokenManager?.getAccessToken() ?? null;\n }\n\n /**\n * Get the current refresh token (token mode only).\n * Returns null if using cookie mode or no token is stored.\n */\n getRefreshToken(): string | null {\n return this.tokenManager?.getRefreshToken() ?? null;\n }\n\n /**\n * Manually set tokens (token mode only).\n * Useful for SSR hydration or external auth flows.\n */\n setTokens(accessToken: string, refreshToken?: string): void {\n this.tokenManager?.setTokens(accessToken, refreshToken);\n }\n\n /**\n * Clear stored tokens.\n */\n clearTokens(): void {\n this.tokenManager?.clearTokens();\n }\n\n /**\n * Check if user is likely authenticated.\n * In token mode: checks if token exists.\n * In cookie mode: always returns null (use validateToken instead).\n */\n isAuthenticated(): boolean | null {\n if (!this.tokenManager || this.simpleConfig?.authMode === 'cookie') {\n return null;\n }\n return !!this.tokenManager.getAccessToken();\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Direct Block Access (for advanced usage)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Access the underlying block for advanced operations\n * Use this when you need access to services not wrapped by this Angular service\n */\n get rawBlock(): AuthenticationBlock {\n return this.block;\n }\n}\n"],"names":["Injectable","Inject","Optional","from","tap","createAuthenticationBlock","TRANSPORT","AUTHENTICATION_CONFIG","TOKEN_MANAGER","SIMPLE_CONFIG","AuthenticationService","isTokenMode","tokenManager","simpleConfig","authMode","signIn","request","block","auth","pipe","response","accessToken","setTokens","refreshToken","signUp","signOut","clearTokens","requestPasswordReset","updatePassword","validateToken","token","getCurrentUser","listUsers","params","users","list","getUser","id","get","updateUser","update","deleteUser","delete","listRoles","roles","getRole","createRole","create","updateRole","deleteRole","listPermissions","listApiKeys","apiKeys","getApiKey","createApiKey","updateApiKey","revokeApiKey","revoke","getAccessToken","getRefreshToken","isAuthenticated","rawBlock","constructor","transport","config","providedIn"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
package/dist/lib/index.js
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
2
|
+
// Simplified API (Recommended)
|
|
3
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
4
|
+
export { provideBlocks23, getBlocks23Providers, TOKEN_MANAGER, SIMPLE_CONFIG } from './simple-providers.js';
|
|
5
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
6
|
+
// Advanced API (Custom transport)
|
|
7
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
1
8
|
// Tokens
|
|
2
9
|
export { TRANSPORT, AUTHENTICATION_CONFIG, SEARCH_CONFIG, PRODUCTS_CONFIG, CRM_CONFIG, CONTENT_CONFIG, GEOLOCATION_CONFIG, CONVERSATIONS_CONFIG, FILES_CONFIG, FORMS_CONFIG, ASSETS_CONFIG, CAMPAIGNS_CONFIG, COMPANY_CONFIG, REWARDS_CONFIG, SALES_CONFIG, WALLET_CONFIG, JARVIS_CONFIG, ONBOARDING_CONFIG, UNIVERSITY_CONFIG } from './tokens.js';
|
|
3
|
-
// Provider functions
|
|
10
|
+
// Provider functions (advanced - requires custom transport)
|
|
4
11
|
export { provide23Blocks, get23BlocksProviders } from './providers.js';
|
|
5
12
|
// Services
|
|
6
13
|
export { AuthenticationService } from './authentication/index.js';
|
package/dist/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/index.ts"],"sourcesContent":["// Tokens\nexport {\n TRANSPORT,\n AUTHENTICATION_CONFIG,\n SEARCH_CONFIG,\n PRODUCTS_CONFIG,\n CRM_CONFIG,\n CONTENT_CONFIG,\n GEOLOCATION_CONFIG,\n CONVERSATIONS_CONFIG,\n FILES_CONFIG,\n FORMS_CONFIG,\n ASSETS_CONFIG,\n CAMPAIGNS_CONFIG,\n COMPANY_CONFIG,\n REWARDS_CONFIG,\n SALES_CONFIG,\n WALLET_CONFIG,\n JARVIS_CONFIG,\n ONBOARDING_CONFIG,\n UNIVERSITY_CONFIG,\n} from './tokens.js';\n\n// Provider functions\nexport { provide23Blocks, get23BlocksProviders, type Provide23BlocksConfig } from './providers.js';\n\n// Services\nexport { AuthenticationService } from './authentication/index.js';\nexport { SearchService } from './search/index.js';\nexport { ProductsService } from './products/index.js';\nexport { CrmService } from './crm/index.js';\nexport { ContentService } from './content/index.js';\nexport { GeolocationService } from './geolocation/index.js';\nexport { ConversationsService } from './conversations/index.js';\nexport { FilesService } from './files/index.js';\nexport { FormsService } from './forms/index.js';\nexport { AssetsService } from './assets/index.js';\nexport { CampaignsService } from './campaigns/index.js';\nexport { CompanyService } from './company/index.js';\nexport { RewardsService } from './rewards/index.js';\nexport { SalesService } from './sales/index.js';\nexport { WalletService } from './wallet/index.js';\nexport { JarvisService } from './jarvis/index.js';\nexport { OnboardingService } from './onboarding/index.js';\nexport { UniversityService } from './university/index.js';\n"],"names":["TRANSPORT","AUTHENTICATION_CONFIG","SEARCH_CONFIG","PRODUCTS_CONFIG","CRM_CONFIG","CONTENT_CONFIG","GEOLOCATION_CONFIG","CONVERSATIONS_CONFIG","FILES_CONFIG","FORMS_CONFIG","ASSETS_CONFIG","CAMPAIGNS_CONFIG","COMPANY_CONFIG","REWARDS_CONFIG","SALES_CONFIG","WALLET_CONFIG","JARVIS_CONFIG","ONBOARDING_CONFIG","UNIVERSITY_CONFIG","provide23Blocks","get23BlocksProviders","AuthenticationService","SearchService","ProductsService","CrmService","ContentService","GeolocationService","ConversationsService","FilesService","FormsService","AssetsService","CampaignsService","CompanyService","RewardsService","SalesService","WalletService","JarvisService","OnboardingService","UniversityService"],"rangeMappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/lib/index.ts"],"sourcesContent":["// ─────────────────────────────────────────────────────────────────────────────\n// Simplified API (Recommended)\n// ─────────────────────────────────────────────────────────────────────────────\nexport {\n provideBlocks23,\n getBlocks23Providers,\n type Simple23BlocksConfig,\n type AuthMode,\n type StorageType,\n type TokenManagerService,\n TOKEN_MANAGER,\n SIMPLE_CONFIG,\n} from './simple-providers.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Advanced API (Custom transport)\n// ─────────────────────────────────────────────────────────────────────────────\n// Tokens\nexport {\n TRANSPORT,\n AUTHENTICATION_CONFIG,\n SEARCH_CONFIG,\n PRODUCTS_CONFIG,\n CRM_CONFIG,\n CONTENT_CONFIG,\n GEOLOCATION_CONFIG,\n CONVERSATIONS_CONFIG,\n FILES_CONFIG,\n FORMS_CONFIG,\n ASSETS_CONFIG,\n CAMPAIGNS_CONFIG,\n COMPANY_CONFIG,\n REWARDS_CONFIG,\n SALES_CONFIG,\n WALLET_CONFIG,\n JARVIS_CONFIG,\n ONBOARDING_CONFIG,\n UNIVERSITY_CONFIG,\n} from './tokens.js';\n\n// Provider functions (advanced - requires custom transport)\nexport { provide23Blocks, get23BlocksProviders, type Provide23BlocksConfig } from './providers.js';\n\n// Services\nexport { AuthenticationService } from './authentication/index.js';\nexport { SearchService } from './search/index.js';\nexport { ProductsService } from './products/index.js';\nexport { CrmService } from './crm/index.js';\nexport { ContentService } from './content/index.js';\nexport { GeolocationService } from './geolocation/index.js';\nexport { ConversationsService } from './conversations/index.js';\nexport { FilesService } from './files/index.js';\nexport { FormsService } from './forms/index.js';\nexport { AssetsService } from './assets/index.js';\nexport { CampaignsService } from './campaigns/index.js';\nexport { CompanyService } from './company/index.js';\nexport { RewardsService } from './rewards/index.js';\nexport { SalesService } from './sales/index.js';\nexport { WalletService } from './wallet/index.js';\nexport { JarvisService } from './jarvis/index.js';\nexport { OnboardingService } from './onboarding/index.js';\nexport { UniversityService } from './university/index.js';\n"],"names":["provideBlocks23","getBlocks23Providers","TOKEN_MANAGER","SIMPLE_CONFIG","TRANSPORT","AUTHENTICATION_CONFIG","SEARCH_CONFIG","PRODUCTS_CONFIG","CRM_CONFIG","CONTENT_CONFIG","GEOLOCATION_CONFIG","CONVERSATIONS_CONFIG","FILES_CONFIG","FORMS_CONFIG","ASSETS_CONFIG","CAMPAIGNS_CONFIG","COMPANY_CONFIG","REWARDS_CONFIG","SALES_CONFIG","WALLET_CONFIG","JARVIS_CONFIG","ONBOARDING_CONFIG","UNIVERSITY_CONFIG","provide23Blocks","get23BlocksProviders","AuthenticationService","SearchService","ProductsService","CrmService","ContentService","GeolocationService","ConversationsService","FilesService","FormsService","AssetsService","CampaignsService","CompanyService","RewardsService","SalesService","WalletService","JarvisService","OnboardingService","UniversityService"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,gFAAgF;AAChF,+BAA+B;AAC/B,gFAAgF;AAChF,SACEA,eAAe,EACfC,oBAAoB,EAKpBC,aAAa,EACbC,aAAa,QACR,wBAAwB;AAE/B,gFAAgF;AAChF,kCAAkC;AAClC,gFAAgF;AAChF,SAAS;AACT,SACEC,SAAS,EACTC,qBAAqB,EACrBC,aAAa,EACbC,eAAe,EACfC,UAAU,EACVC,cAAc,EACdC,kBAAkB,EAClBC,oBAAoB,EACpBC,YAAY,EACZC,YAAY,EACZC,aAAa,EACbC,gBAAgB,EAChBC,cAAc,EACdC,cAAc,EACdC,YAAY,EACZC,aAAa,EACbC,aAAa,EACbC,iBAAiB,EACjBC,iBAAiB,QACZ,cAAc;AAErB,4DAA4D;AAC5D,SAASC,eAAe,EAAEC,oBAAoB,QAAoC,iBAAiB;AAEnG,WAAW;AACX,SAASC,qBAAqB,QAAQ,4BAA4B;AAClE,SAASC,aAAa,QAAQ,oBAAoB;AAClD,SAASC,eAAe,QAAQ,sBAAsB;AACtD,SAASC,UAAU,QAAQ,iBAAiB;AAC5C,SAASC,cAAc,QAAQ,qBAAqB;AACpD,SAASC,kBAAkB,QAAQ,yBAAyB;AAC5D,SAASC,oBAAoB,QAAQ,2BAA2B;AAChE,SAASC,YAAY,QAAQ,mBAAmB;AAChD,SAASC,YAAY,QAAQ,mBAAmB;AAChD,SAASC,aAAa,QAAQ,oBAAoB;AAClD,SAASC,gBAAgB,QAAQ,uBAAuB;AACxD,SAASC,cAAc,QAAQ,qBAAqB;AACpD,SAASC,cAAc,QAAQ,qBAAqB;AACpD,SAASC,YAAY,QAAQ,mBAAmB;AAChD,SAASC,aAAa,QAAQ,oBAAoB;AAClD,SAASC,aAAa,QAAQ,oBAAoB;AAClD,SAASC,iBAAiB,QAAQ,wBAAwB;AAC1D,SAASC,iBAAiB,QAAQ,wBAAwB"}
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
2
|
+
import { InjectionToken, makeEnvironmentProviders } from '@angular/core';
|
|
3
|
+
import { createHttpTransport } from '@23blocks/transport-http';
|
|
4
|
+
import { TRANSPORT, AUTHENTICATION_CONFIG, SEARCH_CONFIG, PRODUCTS_CONFIG, CRM_CONFIG, CONTENT_CONFIG, GEOLOCATION_CONFIG, CONVERSATIONS_CONFIG, FILES_CONFIG, FORMS_CONFIG, ASSETS_CONFIG, CAMPAIGNS_CONFIG, COMPANY_CONFIG, REWARDS_CONFIG, SALES_CONFIG, WALLET_CONFIG, JARVIS_CONFIG, ONBOARDING_CONFIG, UNIVERSITY_CONFIG } from './tokens.js';
|
|
5
|
+
/**
|
|
6
|
+
* Injection token for the token manager (internal use)
|
|
7
|
+
*/ export const TOKEN_MANAGER = new InjectionToken('23blocks.token-manager');
|
|
8
|
+
/**
|
|
9
|
+
* Injection token for simple config
|
|
10
|
+
*/ export const SIMPLE_CONFIG = new InjectionToken('23blocks.simple-config');
|
|
11
|
+
/**
|
|
12
|
+
* Generate storage key scoped to app and tenant
|
|
13
|
+
*/ function getStorageKey(type, appId, tenantId) {
|
|
14
|
+
const scope = tenantId ? `${appId}_${tenantId}` : appId;
|
|
15
|
+
return `23blocks_${scope}_${type}_token`;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* In-memory storage for SSR
|
|
19
|
+
*/ let MemoryStorage = class MemoryStorage {
|
|
20
|
+
getItem(key) {
|
|
21
|
+
var _this_data_get;
|
|
22
|
+
return (_this_data_get = this.data.get(key)) != null ? _this_data_get : null;
|
|
23
|
+
}
|
|
24
|
+
setItem(key, value) {
|
|
25
|
+
this.data.set(key, value);
|
|
26
|
+
}
|
|
27
|
+
removeItem(key) {
|
|
28
|
+
this.data.delete(key);
|
|
29
|
+
}
|
|
30
|
+
constructor(){
|
|
31
|
+
this.data = new Map();
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Create a token manager with scoped storage keys and cross-tab sync
|
|
36
|
+
*/ function createTokenManager(appId, storageType, tenantId) {
|
|
37
|
+
const isBrowser = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';
|
|
38
|
+
const accessTokenKey = getStorageKey('access', appId, tenantId);
|
|
39
|
+
const refreshTokenKey = getStorageKey('refresh', appId, tenantId);
|
|
40
|
+
let storage;
|
|
41
|
+
if (!isBrowser) {
|
|
42
|
+
storage = new MemoryStorage();
|
|
43
|
+
} else {
|
|
44
|
+
switch(storageType){
|
|
45
|
+
case 'sessionStorage':
|
|
46
|
+
storage = window.sessionStorage;
|
|
47
|
+
break;
|
|
48
|
+
case 'memory':
|
|
49
|
+
storage = new MemoryStorage();
|
|
50
|
+
break;
|
|
51
|
+
default:
|
|
52
|
+
storage = window.localStorage;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
getAccessToken () {
|
|
57
|
+
try {
|
|
58
|
+
return storage.getItem(accessTokenKey);
|
|
59
|
+
} catch (e) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
getRefreshToken () {
|
|
64
|
+
try {
|
|
65
|
+
return storage.getItem(refreshTokenKey);
|
|
66
|
+
} catch (e) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
setTokens (accessToken, refreshToken) {
|
|
71
|
+
try {
|
|
72
|
+
storage.setItem(accessTokenKey, accessToken);
|
|
73
|
+
if (refreshToken) {
|
|
74
|
+
storage.setItem(refreshTokenKey, refreshToken);
|
|
75
|
+
}
|
|
76
|
+
} catch (e) {
|
|
77
|
+
console.warn('[23blocks] Unable to store tokens');
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
clearTokens () {
|
|
81
|
+
try {
|
|
82
|
+
storage.removeItem(accessTokenKey);
|
|
83
|
+
storage.removeItem(refreshTokenKey);
|
|
84
|
+
} catch (e) {
|
|
85
|
+
// Silently fail
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
onStorageChange (callback) {
|
|
89
|
+
// Only works in browser with localStorage/sessionStorage
|
|
90
|
+
if (!isBrowser || storageType === 'memory') {
|
|
91
|
+
// Return no-op unsubscribe for SSR/memory storage
|
|
92
|
+
return ()=>{};
|
|
93
|
+
}
|
|
94
|
+
const handler = (event)=>{
|
|
95
|
+
// Only trigger if our keys changed
|
|
96
|
+
if (event.key === accessTokenKey || event.key === refreshTokenKey) {
|
|
97
|
+
callback();
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
window.addEventListener('storage', handler);
|
|
101
|
+
// Return unsubscribe function
|
|
102
|
+
return ()=>{
|
|
103
|
+
window.removeEventListener('storage', handler);
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Create transport with automatic token handling
|
|
110
|
+
*/ function createTransportWithAuth(config, tokenManager) {
|
|
111
|
+
return createHttpTransport({
|
|
112
|
+
baseUrl: config.baseUrl,
|
|
113
|
+
timeout: config.timeout,
|
|
114
|
+
credentials: config.authMode === 'cookie' ? 'include' : undefined,
|
|
115
|
+
headers: ()=>{
|
|
116
|
+
const headers = _extends({}, config.headers, {
|
|
117
|
+
appid: config.appId
|
|
118
|
+
});
|
|
119
|
+
if (config.tenantId) {
|
|
120
|
+
headers['tenant-id'] = config.tenantId;
|
|
121
|
+
}
|
|
122
|
+
// In token mode, add Authorization header if we have a token
|
|
123
|
+
if (config.authMode !== 'cookie') {
|
|
124
|
+
const token = tokenManager.getAccessToken();
|
|
125
|
+
if (token) {
|
|
126
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return headers;
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Provide 23blocks services with simplified configuration.
|
|
135
|
+
*
|
|
136
|
+
* This is the recommended way to set up 23blocks in new Angular applications.
|
|
137
|
+
* It automatically handles token storage and authentication headers.
|
|
138
|
+
*
|
|
139
|
+
* @example Token mode (default)
|
|
140
|
+
* ```typescript
|
|
141
|
+
* // app.config.ts
|
|
142
|
+
* import { ApplicationConfig } from '@angular/core';
|
|
143
|
+
* import { provideBlocks23 } from '@23blocks/angular';
|
|
144
|
+
*
|
|
145
|
+
* export const appConfig: ApplicationConfig = {
|
|
146
|
+
* providers: [
|
|
147
|
+
* provideBlocks23({
|
|
148
|
+
* baseUrl: 'https://api.yourapp.com',
|
|
149
|
+
* appId: 'your-app-id',
|
|
150
|
+
* }),
|
|
151
|
+
* ],
|
|
152
|
+
* };
|
|
153
|
+
* ```
|
|
154
|
+
*
|
|
155
|
+
* @example Cookie mode (recommended for security)
|
|
156
|
+
* ```typescript
|
|
157
|
+
* export const appConfig: ApplicationConfig = {
|
|
158
|
+
* providers: [
|
|
159
|
+
* provideBlocks23({
|
|
160
|
+
* baseUrl: 'https://api.yourapp.com',
|
|
161
|
+
* appId: 'your-app-id',
|
|
162
|
+
* authMode: 'cookie',
|
|
163
|
+
* }),
|
|
164
|
+
* ],
|
|
165
|
+
* };
|
|
166
|
+
* ```
|
|
167
|
+
*/ export function provideBlocks23(config) {
|
|
168
|
+
// Block config for all services
|
|
169
|
+
const blockConfig = {
|
|
170
|
+
appId: config.appId,
|
|
171
|
+
tenantId: config.tenantId
|
|
172
|
+
};
|
|
173
|
+
const providers = [
|
|
174
|
+
// Store config for injection
|
|
175
|
+
{
|
|
176
|
+
provide: SIMPLE_CONFIG,
|
|
177
|
+
useValue: config
|
|
178
|
+
},
|
|
179
|
+
// Token manager factory - creates singleton within the injector
|
|
180
|
+
{
|
|
181
|
+
provide: TOKEN_MANAGER,
|
|
182
|
+
useFactory: ()=>{
|
|
183
|
+
var _config_storage;
|
|
184
|
+
const storage = (_config_storage = config.storage) != null ? _config_storage : 'localStorage';
|
|
185
|
+
return createTokenManager(config.appId, storage, config.tenantId);
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
// Transport factory - depends on token manager
|
|
189
|
+
{
|
|
190
|
+
provide: TRANSPORT,
|
|
191
|
+
useFactory: (tokenManager)=>{
|
|
192
|
+
return createTransportWithAuth(config, tokenManager);
|
|
193
|
+
},
|
|
194
|
+
deps: [
|
|
195
|
+
TOKEN_MANAGER
|
|
196
|
+
]
|
|
197
|
+
},
|
|
198
|
+
// Block configs
|
|
199
|
+
{
|
|
200
|
+
provide: AUTHENTICATION_CONFIG,
|
|
201
|
+
useValue: blockConfig
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
provide: SEARCH_CONFIG,
|
|
205
|
+
useValue: blockConfig
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
provide: PRODUCTS_CONFIG,
|
|
209
|
+
useValue: blockConfig
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
provide: CRM_CONFIG,
|
|
213
|
+
useValue: blockConfig
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
provide: CONTENT_CONFIG,
|
|
217
|
+
useValue: blockConfig
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
provide: GEOLOCATION_CONFIG,
|
|
221
|
+
useValue: blockConfig
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
provide: CONVERSATIONS_CONFIG,
|
|
225
|
+
useValue: blockConfig
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
provide: FILES_CONFIG,
|
|
229
|
+
useValue: blockConfig
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
provide: FORMS_CONFIG,
|
|
233
|
+
useValue: blockConfig
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
provide: ASSETS_CONFIG,
|
|
237
|
+
useValue: blockConfig
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
provide: CAMPAIGNS_CONFIG,
|
|
241
|
+
useValue: blockConfig
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
provide: COMPANY_CONFIG,
|
|
245
|
+
useValue: blockConfig
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
provide: REWARDS_CONFIG,
|
|
249
|
+
useValue: blockConfig
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
provide: SALES_CONFIG,
|
|
253
|
+
useValue: blockConfig
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
provide: WALLET_CONFIG,
|
|
257
|
+
useValue: blockConfig
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
provide: JARVIS_CONFIG,
|
|
261
|
+
useValue: blockConfig
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
provide: ONBOARDING_CONFIG,
|
|
265
|
+
useValue: blockConfig
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
provide: UNIVERSITY_CONFIG,
|
|
269
|
+
useValue: blockConfig
|
|
270
|
+
}
|
|
271
|
+
];
|
|
272
|
+
return makeEnvironmentProviders(providers);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Get providers array for NgModule-based applications with simplified config.
|
|
276
|
+
*
|
|
277
|
+
* @example
|
|
278
|
+
* ```typescript
|
|
279
|
+
* // app.module.ts
|
|
280
|
+
* import { NgModule } from '@angular/core';
|
|
281
|
+
* import { getBlocks23Providers } from '@23blocks/angular';
|
|
282
|
+
*
|
|
283
|
+
* @NgModule({
|
|
284
|
+
* providers: [
|
|
285
|
+
* ...getBlocks23Providers({
|
|
286
|
+
* baseUrl: 'https://api.yourapp.com',
|
|
287
|
+
* appId: 'your-app-id',
|
|
288
|
+
* }),
|
|
289
|
+
* ],
|
|
290
|
+
* })
|
|
291
|
+
* export class AppModule {}
|
|
292
|
+
* ```
|
|
293
|
+
*/ export function getBlocks23Providers(config) {
|
|
294
|
+
// Block config for all services
|
|
295
|
+
const blockConfig = {
|
|
296
|
+
appId: config.appId,
|
|
297
|
+
tenantId: config.tenantId
|
|
298
|
+
};
|
|
299
|
+
return [
|
|
300
|
+
// Store config for injection
|
|
301
|
+
{
|
|
302
|
+
provide: SIMPLE_CONFIG,
|
|
303
|
+
useValue: config
|
|
304
|
+
},
|
|
305
|
+
// Token manager factory - creates singleton within the injector
|
|
306
|
+
{
|
|
307
|
+
provide: TOKEN_MANAGER,
|
|
308
|
+
useFactory: ()=>{
|
|
309
|
+
var _config_storage;
|
|
310
|
+
const storage = (_config_storage = config.storage) != null ? _config_storage : 'localStorage';
|
|
311
|
+
return createTokenManager(config.appId, storage, config.tenantId);
|
|
312
|
+
}
|
|
313
|
+
},
|
|
314
|
+
// Transport factory - depends on token manager
|
|
315
|
+
{
|
|
316
|
+
provide: TRANSPORT,
|
|
317
|
+
useFactory: (tokenManager)=>{
|
|
318
|
+
return createTransportWithAuth(config, tokenManager);
|
|
319
|
+
},
|
|
320
|
+
deps: [
|
|
321
|
+
TOKEN_MANAGER
|
|
322
|
+
]
|
|
323
|
+
},
|
|
324
|
+
// Block configs
|
|
325
|
+
{
|
|
326
|
+
provide: AUTHENTICATION_CONFIG,
|
|
327
|
+
useValue: blockConfig
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
provide: SEARCH_CONFIG,
|
|
331
|
+
useValue: blockConfig
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
provide: PRODUCTS_CONFIG,
|
|
335
|
+
useValue: blockConfig
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
provide: CRM_CONFIG,
|
|
339
|
+
useValue: blockConfig
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
provide: CONTENT_CONFIG,
|
|
343
|
+
useValue: blockConfig
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
provide: GEOLOCATION_CONFIG,
|
|
347
|
+
useValue: blockConfig
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
provide: CONVERSATIONS_CONFIG,
|
|
351
|
+
useValue: blockConfig
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
provide: FILES_CONFIG,
|
|
355
|
+
useValue: blockConfig
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
provide: FORMS_CONFIG,
|
|
359
|
+
useValue: blockConfig
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
provide: ASSETS_CONFIG,
|
|
363
|
+
useValue: blockConfig
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
provide: CAMPAIGNS_CONFIG,
|
|
367
|
+
useValue: blockConfig
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
provide: COMPANY_CONFIG,
|
|
371
|
+
useValue: blockConfig
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
provide: REWARDS_CONFIG,
|
|
375
|
+
useValue: blockConfig
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
provide: SALES_CONFIG,
|
|
379
|
+
useValue: blockConfig
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
provide: WALLET_CONFIG,
|
|
383
|
+
useValue: blockConfig
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
provide: JARVIS_CONFIG,
|
|
387
|
+
useValue: blockConfig
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
provide: ONBOARDING_CONFIG,
|
|
391
|
+
useValue: blockConfig
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
provide: UNIVERSITY_CONFIG,
|
|
395
|
+
useValue: blockConfig
|
|
396
|
+
}
|
|
397
|
+
];
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
//# sourceMappingURL=simple-providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/simple-providers.ts"],"sourcesContent":["import type { Provider, EnvironmentProviders } from '@angular/core';\nimport { InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport { createHttpTransport } from '@23blocks/transport-http';\nimport type { Transport } from '@23blocks/contracts';\nimport {\n TRANSPORT,\n AUTHENTICATION_CONFIG,\n SEARCH_CONFIG,\n PRODUCTS_CONFIG,\n CRM_CONFIG,\n CONTENT_CONFIG,\n GEOLOCATION_CONFIG,\n CONVERSATIONS_CONFIG,\n FILES_CONFIG,\n FORMS_CONFIG,\n ASSETS_CONFIG,\n CAMPAIGNS_CONFIG,\n COMPANY_CONFIG,\n REWARDS_CONFIG,\n SALES_CONFIG,\n WALLET_CONFIG,\n JARVIS_CONFIG,\n ONBOARDING_CONFIG,\n UNIVERSITY_CONFIG,\n} from './tokens.js';\n\n/**\n * Authentication mode for the simplified API\n */\nexport type AuthMode = 'token' | 'cookie';\n\n/**\n * Storage type for token mode\n */\nexport type StorageType = 'localStorage' | 'sessionStorage' | 'memory';\n\n/**\n * Simplified configuration for providing 23blocks services\n */\nexport interface Simple23BlocksConfig {\n /**\n * Base URL for the 23blocks API\n * @example 'https://api.yourapp.com'\n */\n baseUrl: string;\n\n /**\n * Application ID\n */\n appId: string;\n\n /**\n * Tenant ID (optional, for multi-tenant setups)\n */\n tenantId?: string;\n\n /**\n * Authentication mode\n * - 'token' (default): SDK stores tokens in localStorage/sessionStorage/memory\n * - 'cookie': Backend manages auth via httpOnly cookies\n */\n authMode?: AuthMode;\n\n /**\n * Storage type for token mode\n * @default 'localStorage'\n */\n storage?: StorageType;\n\n /**\n * Additional headers to include with every request\n */\n headers?: Record<string, string>;\n\n /**\n * Request timeout in milliseconds\n * @default 30000\n */\n timeout?: number;\n}\n\n/**\n * Injection token for the token manager (internal use)\n */\nexport const TOKEN_MANAGER = new InjectionToken<TokenManagerService>('23blocks.token-manager');\n\n/**\n * Injection token for simple config\n */\nexport const SIMPLE_CONFIG = new InjectionToken<Simple23BlocksConfig>('23blocks.simple-config');\n\n/**\n * Token manager interface\n */\nexport interface TokenManagerService {\n getAccessToken(): string | null;\n getRefreshToken(): string | null;\n setTokens(accessToken: string, refreshToken?: string): void;\n clearTokens(): void;\n /**\n * Subscribe to storage changes from other tabs/windows.\n * Returns an unsubscribe function.\n */\n onStorageChange(callback: () => void): () => void;\n}\n\n/**\n * Generate storage key scoped to app and tenant\n */\nfunction getStorageKey(type: 'access' | 'refresh', appId: string, tenantId?: string): string {\n const scope = tenantId ? `${appId}_${tenantId}` : appId;\n return `23blocks_${scope}_${type}_token`;\n}\n\n/**\n * In-memory storage for SSR\n */\nclass MemoryStorage {\n private data = new Map<string, string>();\n getItem(key: string): string | null {\n return this.data.get(key) ?? null;\n }\n setItem(key: string, value: string): void {\n this.data.set(key, value);\n }\n removeItem(key: string): void {\n this.data.delete(key);\n }\n}\n\n/**\n * Create a token manager with scoped storage keys and cross-tab sync\n */\nfunction createTokenManager(\n appId: string,\n storageType: StorageType,\n tenantId?: string\n): TokenManagerService {\n const isBrowser = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';\n\n const accessTokenKey = getStorageKey('access', appId, tenantId);\n const refreshTokenKey = getStorageKey('refresh', appId, tenantId);\n\n let storage: Storage | MemoryStorage;\n if (!isBrowser) {\n storage = new MemoryStorage();\n } else {\n switch (storageType) {\n case 'sessionStorage':\n storage = window.sessionStorage;\n break;\n case 'memory':\n storage = new MemoryStorage();\n break;\n default:\n storage = window.localStorage;\n }\n }\n\n return {\n getAccessToken(): string | null {\n try {\n return storage.getItem(accessTokenKey);\n } catch {\n return null;\n }\n },\n getRefreshToken(): string | null {\n try {\n return storage.getItem(refreshTokenKey);\n } catch {\n return null;\n }\n },\n setTokens(accessToken: string, refreshToken?: string): void {\n try {\n storage.setItem(accessTokenKey, accessToken);\n if (refreshToken) {\n storage.setItem(refreshTokenKey, refreshToken);\n }\n } catch {\n console.warn('[23blocks] Unable to store tokens');\n }\n },\n clearTokens(): void {\n try {\n storage.removeItem(accessTokenKey);\n storage.removeItem(refreshTokenKey);\n } catch {\n // Silently fail\n }\n },\n onStorageChange(callback: () => void): () => void {\n // Only works in browser with localStorage/sessionStorage\n if (!isBrowser || storageType === 'memory') {\n // Return no-op unsubscribe for SSR/memory storage\n return () => {};\n }\n\n const handler = (event: StorageEvent) => {\n // Only trigger if our keys changed\n if (event.key === accessTokenKey || event.key === refreshTokenKey) {\n callback();\n }\n };\n\n window.addEventListener('storage', handler);\n\n // Return unsubscribe function\n return () => {\n window.removeEventListener('storage', handler);\n };\n },\n };\n}\n\n/**\n * Create transport with automatic token handling\n */\nfunction createTransportWithAuth(config: Simple23BlocksConfig, tokenManager: TokenManagerService): Transport {\n return createHttpTransport({\n baseUrl: config.baseUrl,\n timeout: config.timeout,\n credentials: config.authMode === 'cookie' ? 'include' : undefined,\n headers: () => {\n const headers: Record<string, string> = {\n ...config.headers,\n appid: config.appId,\n };\n\n if (config.tenantId) {\n headers['tenant-id'] = config.tenantId;\n }\n\n // In token mode, add Authorization header if we have a token\n if (config.authMode !== 'cookie') {\n const token = tokenManager.getAccessToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n }\n\n return headers;\n },\n });\n}\n\n/**\n * Provide 23blocks services with simplified configuration.\n *\n * This is the recommended way to set up 23blocks in new Angular applications.\n * It automatically handles token storage and authentication headers.\n *\n * @example Token mode (default)\n * ```typescript\n * // app.config.ts\n * import { ApplicationConfig } from '@angular/core';\n * import { provideBlocks23 } from '@23blocks/angular';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideBlocks23({\n * baseUrl: 'https://api.yourapp.com',\n * appId: 'your-app-id',\n * }),\n * ],\n * };\n * ```\n *\n * @example Cookie mode (recommended for security)\n * ```typescript\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideBlocks23({\n * baseUrl: 'https://api.yourapp.com',\n * appId: 'your-app-id',\n * authMode: 'cookie',\n * }),\n * ],\n * };\n * ```\n */\nexport function provideBlocks23(config: Simple23BlocksConfig): EnvironmentProviders {\n // Block config for all services\n const blockConfig = { appId: config.appId, tenantId: config.tenantId };\n\n const providers: Provider[] = [\n // Store config for injection\n { provide: SIMPLE_CONFIG, useValue: config },\n\n // Token manager factory - creates singleton within the injector\n {\n provide: TOKEN_MANAGER,\n useFactory: () => {\n const storage = config.storage ?? 'localStorage';\n return createTokenManager(config.appId, storage, config.tenantId);\n },\n },\n\n // Transport factory - depends on token manager\n {\n provide: TRANSPORT,\n useFactory: (tokenManager: TokenManagerService) => {\n return createTransportWithAuth(config, tokenManager);\n },\n deps: [TOKEN_MANAGER],\n },\n\n // Block configs\n { provide: AUTHENTICATION_CONFIG, useValue: blockConfig },\n { provide: SEARCH_CONFIG, useValue: blockConfig },\n { provide: PRODUCTS_CONFIG, useValue: blockConfig },\n { provide: CRM_CONFIG, useValue: blockConfig },\n { provide: CONTENT_CONFIG, useValue: blockConfig },\n { provide: GEOLOCATION_CONFIG, useValue: blockConfig },\n { provide: CONVERSATIONS_CONFIG, useValue: blockConfig },\n { provide: FILES_CONFIG, useValue: blockConfig },\n { provide: FORMS_CONFIG, useValue: blockConfig },\n { provide: ASSETS_CONFIG, useValue: blockConfig },\n { provide: CAMPAIGNS_CONFIG, useValue: blockConfig },\n { provide: COMPANY_CONFIG, useValue: blockConfig },\n { provide: REWARDS_CONFIG, useValue: blockConfig },\n { provide: SALES_CONFIG, useValue: blockConfig },\n { provide: WALLET_CONFIG, useValue: blockConfig },\n { provide: JARVIS_CONFIG, useValue: blockConfig },\n { provide: ONBOARDING_CONFIG, useValue: blockConfig },\n { provide: UNIVERSITY_CONFIG, useValue: blockConfig },\n ];\n\n return makeEnvironmentProviders(providers);\n}\n\n/**\n * Get providers array for NgModule-based applications with simplified config.\n *\n * @example\n * ```typescript\n * // app.module.ts\n * import { NgModule } from '@angular/core';\n * import { getBlocks23Providers } from '@23blocks/angular';\n *\n * @NgModule({\n * providers: [\n * ...getBlocks23Providers({\n * baseUrl: 'https://api.yourapp.com',\n * appId: 'your-app-id',\n * }),\n * ],\n * })\n * export class AppModule {}\n * ```\n */\nexport function getBlocks23Providers(config: Simple23BlocksConfig): Provider[] {\n // Block config for all services\n const blockConfig = { appId: config.appId, tenantId: config.tenantId };\n\n return [\n // Store config for injection\n { provide: SIMPLE_CONFIG, useValue: config },\n\n // Token manager factory - creates singleton within the injector\n {\n provide: TOKEN_MANAGER,\n useFactory: () => {\n const storage = config.storage ?? 'localStorage';\n return createTokenManager(config.appId, storage, config.tenantId);\n },\n },\n\n // Transport factory - depends on token manager\n {\n provide: TRANSPORT,\n useFactory: (tokenManager: TokenManagerService) => {\n return createTransportWithAuth(config, tokenManager);\n },\n deps: [TOKEN_MANAGER],\n },\n\n // Block configs\n { provide: AUTHENTICATION_CONFIG, useValue: blockConfig },\n { provide: SEARCH_CONFIG, useValue: blockConfig },\n { provide: PRODUCTS_CONFIG, useValue: blockConfig },\n { provide: CRM_CONFIG, useValue: blockConfig },\n { provide: CONTENT_CONFIG, useValue: blockConfig },\n { provide: GEOLOCATION_CONFIG, useValue: blockConfig },\n { provide: CONVERSATIONS_CONFIG, useValue: blockConfig },\n { provide: FILES_CONFIG, useValue: blockConfig },\n { provide: FORMS_CONFIG, useValue: blockConfig },\n { provide: ASSETS_CONFIG, useValue: blockConfig },\n { provide: CAMPAIGNS_CONFIG, useValue: blockConfig },\n { provide: COMPANY_CONFIG, useValue: blockConfig },\n { provide: REWARDS_CONFIG, useValue: blockConfig },\n { provide: SALES_CONFIG, useValue: blockConfig },\n { provide: WALLET_CONFIG, useValue: blockConfig },\n { provide: JARVIS_CONFIG, useValue: blockConfig },\n { provide: ONBOARDING_CONFIG, useValue: blockConfig },\n { provide: UNIVERSITY_CONFIG, useValue: blockConfig },\n ];\n}\n"],"names":["InjectionToken","makeEnvironmentProviders","createHttpTransport","TRANSPORT","AUTHENTICATION_CONFIG","SEARCH_CONFIG","PRODUCTS_CONFIG","CRM_CONFIG","CONTENT_CONFIG","GEOLOCATION_CONFIG","CONVERSATIONS_CONFIG","FILES_CONFIG","FORMS_CONFIG","ASSETS_CONFIG","CAMPAIGNS_CONFIG","COMPANY_CONFIG","REWARDS_CONFIG","SALES_CONFIG","WALLET_CONFIG","JARVIS_CONFIG","ONBOARDING_CONFIG","UNIVERSITY_CONFIG","TOKEN_MANAGER","SIMPLE_CONFIG","getStorageKey","type","appId","tenantId","scope","MemoryStorage","getItem","key","data","get","setItem","value","set","removeItem","delete","Map","createTokenManager","storageType","isBrowser","window","localStorage","accessTokenKey","refreshTokenKey","storage","sessionStorage","getAccessToken","getRefreshToken","setTokens","accessToken","refreshToken","console","warn","clearTokens","onStorageChange","callback","handler","event","addEventListener","removeEventListener","createTransportWithAuth","config","tokenManager","baseUrl","timeout","credentials","authMode","undefined","headers","appid","token","provideBlocks23","blockConfig","providers","provide","useValue","useFactory","deps","getBlocks23Providers"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@23blocks/angular",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Angular bindings for 23blocks SDK - Injectable services with RxJS Observables",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "23blocks <hello@23blocks.com>",
|
|
@@ -57,6 +57,7 @@
|
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
59
|
"@23blocks/contracts": "*",
|
|
60
|
+
"@23blocks/transport-http": "*",
|
|
60
61
|
"@23blocks/block-authentication": "*",
|
|
61
62
|
"@23blocks/block-search": "*",
|
|
62
63
|
"@23blocks/block-products": "*",
|