@23blocks/angular 1.0.2 → 1.1.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 (43) hide show
  1. package/dist/lib/assets/assets.service.js +43 -30
  2. package/dist/lib/assets/assets.service.js.map +1 -1
  3. package/dist/lib/authentication/authentication.service.js +49 -32
  4. package/dist/lib/authentication/authentication.service.js.map +1 -1
  5. package/dist/lib/campaigns/campaigns.service.js +51 -38
  6. package/dist/lib/campaigns/campaigns.service.js.map +1 -1
  7. package/dist/lib/company/company.service.js +50 -37
  8. package/dist/lib/company/company.service.js.map +1 -1
  9. package/dist/lib/content/content.service.js +52 -39
  10. package/dist/lib/content/content.service.js.map +1 -1
  11. package/dist/lib/conversations/conversations.service.js +59 -46
  12. package/dist/lib/conversations/conversations.service.js.map +1 -1
  13. package/dist/lib/crm/crm.service.js +69 -56
  14. package/dist/lib/crm/crm.service.js.map +1 -1
  15. package/dist/lib/files/files.service.js +42 -29
  16. package/dist/lib/files/files.service.js.map +1 -1
  17. package/dist/lib/forms/forms.service.js +45 -32
  18. package/dist/lib/forms/forms.service.js.map +1 -1
  19. package/dist/lib/geolocation/geolocation.service.js +78 -65
  20. package/dist/lib/geolocation/geolocation.service.js.map +1 -1
  21. package/dist/lib/index.js +4 -1
  22. package/dist/lib/index.js.map +1 -1
  23. package/dist/lib/jarvis/jarvis.service.js +54 -41
  24. package/dist/lib/jarvis/jarvis.service.js.map +1 -1
  25. package/dist/lib/onboarding/onboarding.service.js +45 -32
  26. package/dist/lib/onboarding/onboarding.service.js.map +1 -1
  27. package/dist/lib/products/products.service.js +80 -67
  28. package/dist/lib/products/products.service.js.map +1 -1
  29. package/dist/lib/rewards/rewards.service.js +47 -34
  30. package/dist/lib/rewards/rewards.service.js.map +1 -1
  31. package/dist/lib/sales/sales.service.js +47 -34
  32. package/dist/lib/sales/sales.service.js.map +1 -1
  33. package/dist/lib/search/search.service.js +31 -18
  34. package/dist/lib/search/search.service.js.map +1 -1
  35. package/dist/lib/simple-providers.js +109 -12
  36. package/dist/lib/simple-providers.js.map +1 -1
  37. package/dist/lib/tokens.js +26 -1
  38. package/dist/lib/tokens.js.map +1 -1
  39. package/dist/lib/university/university.service.js +58 -45
  40. package/dist/lib/university/university.service.js.map +1 -1
  41. package/dist/lib/wallet/wallet.service.js +39 -26
  42. package/dist/lib/wallet/wallet.service.js.map +1 -1
  43. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/search/search.service.ts"],"sourcesContent":["import { Injectable, Inject } from '@angular/core';\nimport { Observable, from } from 'rxjs';\nimport type { Transport } from '@23blocks/contracts';\nimport {\n createSearchBlock,\n type SearchBlock,\n type SearchBlockConfig,\n type SearchResult,\n type SearchQuery,\n type LastQuery,\n type FavoriteEntity,\n type EntityType,\n type SearchRequest,\n type SearchResponse,\n type AddFavoriteRequest,\n} from '@23blocks/block-search';\nimport { TRANSPORT, SEARCH_CONFIG } from '../tokens.js';\n\n/**\n * Angular service wrapping the Search block.\n * Converts Promise-based APIs to RxJS Observables.\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class SearchComponent {\n * results$ = new BehaviorSubject<SearchResult[]>([]);\n *\n * constructor(private searchService: SearchService) {}\n *\n * onSearch(query: string) {\n * this.searchService.search({ query }).subscribe({\n * next: (response) => this.results$.next(response.results),\n * error: (err) => console.error('Search failed:', err),\n * });\n * }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class SearchService {\n private readonly block: SearchBlock;\n\n constructor(\n @Inject(TRANSPORT) transport: Transport,\n @Inject(SEARCH_CONFIG) config: SearchBlockConfig\n ) {\n this.block = createSearchBlock(transport, config);\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Search Operations\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Perform a search query\n */\n search(request: SearchRequest): Observable<SearchResponse> {\n return from(this.block.search.search(request));\n }\n\n /**\n * Get search suggestions for autocomplete\n */\n suggest(query: string, limit?: number): Observable<SearchResult[]> {\n return from(this.block.search.suggest(query, limit));\n }\n\n /**\n * Get available entity types for filtering\n */\n getEntityTypes(): Observable<EntityType[]> {\n return from(this.block.search.entityTypes());\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Search History\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Get recent search queries\n */\n getLastQueries(limit?: number): Observable<LastQuery[]> {\n return from(this.block.history.getLastQueries(limit));\n }\n\n /**\n * Get the full history of search queries\n */\n getQueryHistory(params?: { page?: number; perPage?: number }): Observable<SearchQuery[]> {\n return from(this.block.history.getHistory(params));\n }\n\n /**\n * Clear search history\n */\n clearHistory(): Observable<void> {\n return from(this.block.history.clear());\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Favorites\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * List user's favorite entities\n */\n listFavorites(): Observable<FavoriteEntity[]> {\n return from(this.block.favorites.list());\n }\n\n /**\n * Add an entity to favorites\n */\n addFavorite(request: AddFavoriteRequest): Observable<FavoriteEntity> {\n return from(this.block.favorites.add(request));\n }\n\n /**\n * Remove an entity from favorites\n */\n removeFavorite(id: string): Observable<void> {\n return from(this.block.favorites.remove(id));\n }\n\n /**\n * Check if an entity is favorited\n */\n isFavorite(entityUniqueId: string): Observable<boolean> {\n return from(this.block.favorites.isFavorite(entityUniqueId));\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Direct Block Access (for advanced usage)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Access the underlying block for advanced operations\n */\n get rawBlock(): SearchBlock {\n return this.block;\n }\n}\n"],"names":["Injectable","Inject","from","createSearchBlock","TRANSPORT","SEARCH_CONFIG","SearchService","search","request","block","suggest","query","limit","getEntityTypes","entityTypes","getLastQueries","history","getQueryHistory","params","getHistory","clearHistory","clear","listFavorites","favorites","list","addFavorite","add","removeFavorite","id","remove","isFavorite","entityUniqueId","rawBlock","constructor","transport","config","providedIn"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;AAAA,SAASA,UAAU,EAAEC,MAAM,QAAQ,gBAAgB;AACnD,SAAqBC,IAAI,QAAQ,OAAO;AAExC,SACEC,iBAAiB,QAWZ,yBAAyB;AAChC,SAASC,SAAS,EAAEC,aAAa,QAAQ,eAAe;AAwBxD,OAAO,MAAMC;IAUX,gFAAgF;IAChF,oBAAoB;IACpB,gFAAgF;IAEhF;;GAEC,GACDC,OAAOC,OAAsB,EAA8B;QACzD,OAAON,KAAK,IAAI,CAACO,KAAK,CAACF,MAAM,CAACA,MAAM,CAACC;IACvC;IAEA;;GAEC,GACDE,QAAQC,KAAa,EAAEC,KAAc,EAA8B;QACjE,OAAOV,KAAK,IAAI,CAACO,KAAK,CAACF,MAAM,CAACG,OAAO,CAACC,OAAOC;IAC/C;IAEA;;GAEC,GACDC,iBAA2C;QACzC,OAAOX,KAAK,IAAI,CAACO,KAAK,CAACF,MAAM,CAACO,WAAW;IAC3C;IAEA,gFAAgF;IAChF,iBAAiB;IACjB,gFAAgF;IAEhF;;GAEC,GACDC,eAAeH,KAAc,EAA2B;QACtD,OAAOV,KAAK,IAAI,CAACO,KAAK,CAACO,OAAO,CAACD,cAAc,CAACH;IAChD;IAEA;;GAEC,GACDK,gBAAgBC,MAA4C,EAA6B;QACvF,OAAOhB,KAAK,IAAI,CAACO,KAAK,CAACO,OAAO,CAACG,UAAU,CAACD;IAC5C;IAEA;;GAEC,GACDE,eAAiC;QAC/B,OAAOlB,KAAK,IAAI,CAACO,KAAK,CAACO,OAAO,CAACK,KAAK;IACtC;IAEA,gFAAgF;IAChF,YAAY;IACZ,gFAAgF;IAEhF;;GAEC,GACDC,gBAA8C;QAC5C,OAAOpB,KAAK,IAAI,CAACO,KAAK,CAACc,SAAS,CAACC,IAAI;IACvC;IAEA;;GAEC,GACDC,YAAYjB,OAA2B,EAA8B;QACnE,OAAON,KAAK,IAAI,CAACO,KAAK,CAACc,SAAS,CAACG,GAAG,CAAClB;IACvC;IAEA;;GAEC,GACDmB,eAAeC,EAAU,EAAoB;QAC3C,OAAO1B,KAAK,IAAI,CAACO,KAAK,CAACc,SAAS,CAACM,MAAM,CAACD;IAC1C;IAEA;;GAEC,GACDE,WAAWC,cAAsB,EAAuB;QACtD,OAAO7B,KAAK,IAAI,CAACO,KAAK,CAACc,SAAS,CAACO,UAAU,CAACC;IAC9C;IAEA,gFAAgF;IAChF,2CAA2C;IAC3C,gFAAgF;IAEhF;;GAEC,GACD,IAAIC,WAAwB;QAC1B,OAAO,IAAI,CAACvB,KAAK;IACnB;IAlGAwB,YACE,AAAmBC,SAAoB,EACvC,AAAuBC,MAAyB,CAChD;QACA,IAAI,CAAC1B,KAAK,GAAGN,kBAAkB+B,WAAWC;IAC5C;AA8FF;AAtGa7B;IADZN,WAAW;QAAEoC,YAAY;IAAO;IAK5BnC,aAAAA,OAAOG;IACPH,aAAAA,OAAOI;;;eADsB,qCAAA;eACC,6CAAA;;GALtBC"}
1
+ {"version":3,"sources":["../../../src/lib/search/search.service.ts"],"sourcesContent":["import { Injectable, Inject, Optional } from '@angular/core';\nimport { Observable, from } from 'rxjs';\nimport type { Transport } from '@23blocks/contracts';\nimport {\n createSearchBlock,\n type SearchBlock,\n type SearchBlockConfig,\n type SearchResult,\n type SearchQuery,\n type LastQuery,\n type FavoriteEntity,\n type EntityType,\n type SearchRequest,\n type SearchResponse,\n type AddFavoriteRequest,\n} from '@23blocks/block-search';\nimport { TRANSPORT, SEARCH_TRANSPORT, SEARCH_CONFIG } from '../tokens.js';\n\n/**\n * Angular service wrapping the Search block.\n * Converts Promise-based APIs to RxJS Observables.\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class SearchComponent {\n * results$ = new BehaviorSubject<SearchResult[]>([]);\n *\n * constructor(private searchService: SearchService) {}\n *\n * onSearch(query: string) {\n * this.searchService.search({ query }).subscribe({\n * next: (response) => this.results$.next(response.results),\n * error: (err) => console.error('Search failed:', err),\n * });\n * }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class SearchService {\n private readonly block: SearchBlock | null;\n\n constructor(\n @Optional() @Inject(SEARCH_TRANSPORT) serviceTransport: Transport | null,\n @Optional() @Inject(TRANSPORT) legacyTransport: Transport | null,\n @Inject(SEARCH_CONFIG) config: SearchBlockConfig\n ) {\n const transport = serviceTransport ?? legacyTransport;\n this.block = transport ? createSearchBlock(transport, config) : null;\n }\n\n /**\n * Ensure the service is configured, throw helpful error if not\n */\n private ensureConfigured(): SearchBlock {\n if (!this.block) {\n throw new Error(\n '[23blocks] SearchService is not configured. ' +\n \"Add 'urls.search' to your provideBlocks23() configuration.\"\n );\n }\n return this.block;\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Search Operations\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Perform a search query\n */\n search(request: SearchRequest): Observable<SearchResponse> {\n return from(this.ensureConfigured().search.search(request));\n }\n\n /**\n * Get search suggestions for autocomplete\n */\n suggest(query: string, limit?: number): Observable<SearchResult[]> {\n return from(this.ensureConfigured().search.suggest(query, limit));\n }\n\n /**\n * Get available entity types for filtering\n */\n getEntityTypes(): Observable<EntityType[]> {\n return from(this.ensureConfigured().search.entityTypes());\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Search History\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Get recent search queries\n */\n getLastQueries(limit?: number): Observable<LastQuery[]> {\n return from(this.ensureConfigured().history.getLastQueries(limit));\n }\n\n /**\n * Get the full history of search queries\n */\n getQueryHistory(params?: { page?: number; perPage?: number }): Observable<SearchQuery[]> {\n return from(this.ensureConfigured().history.getHistory(params));\n }\n\n /**\n * Clear search history\n */\n clearHistory(): Observable<void> {\n return from(this.ensureConfigured().history.clear());\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Favorites\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * List user's favorite entities\n */\n listFavorites(): Observable<FavoriteEntity[]> {\n return from(this.ensureConfigured().favorites.list());\n }\n\n /**\n * Add an entity to favorites\n */\n addFavorite(request: AddFavoriteRequest): Observable<FavoriteEntity> {\n return from(this.ensureConfigured().favorites.add(request));\n }\n\n /**\n * Remove an entity from favorites\n */\n removeFavorite(id: string): Observable<void> {\n return from(this.ensureConfigured().favorites.remove(id));\n }\n\n /**\n * Check if an entity is favorited\n */\n isFavorite(entityUniqueId: string): Observable<boolean> {\n return from(this.ensureConfigured().favorites.isFavorite(entityUniqueId));\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Direct Block Access (for advanced usage)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Access the underlying block for advanced operations\n */\n get rawBlock(): SearchBlock {\n return this.ensureConfigured();\n }\n}\n"],"names":["Injectable","Inject","Optional","from","createSearchBlock","TRANSPORT","SEARCH_TRANSPORT","SEARCH_CONFIG","SearchService","ensureConfigured","block","Error","search","request","suggest","query","limit","getEntityTypes","entityTypes","getLastQueries","history","getQueryHistory","params","getHistory","clearHistory","clear","listFavorites","favorites","list","addFavorite","add","removeFavorite","id","remove","isFavorite","entityUniqueId","rawBlock","constructor","serviceTransport","legacyTransport","config","transport","providedIn"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;AAAA,SAASA,UAAU,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,gBAAgB;AAC7D,SAAqBC,IAAI,QAAQ,OAAO;AAExC,SACEC,iBAAiB,QAWZ,yBAAyB;AAChC,SAASC,SAAS,EAAEC,gBAAgB,EAAEC,aAAa,QAAQ,eAAe;AAwB1E,OAAO,MAAMC;IAYX;;GAEC,GACD,AAAQC,mBAAgC;QACtC,IAAI,CAAC,IAAI,CAACC,KAAK,EAAE;YACf,MAAM,IAAIC,MACR,iDACA;QAEJ;QACA,OAAO,IAAI,CAACD,KAAK;IACnB;IAEA,gFAAgF;IAChF,oBAAoB;IACpB,gFAAgF;IAEhF;;GAEC,GACDE,OAAOC,OAAsB,EAA8B;QACzD,OAAOV,KAAK,IAAI,CAACM,gBAAgB,GAAGG,MAAM,CAACA,MAAM,CAACC;IACpD;IAEA;;GAEC,GACDC,QAAQC,KAAa,EAAEC,KAAc,EAA8B;QACjE,OAAOb,KAAK,IAAI,CAACM,gBAAgB,GAAGG,MAAM,CAACE,OAAO,CAACC,OAAOC;IAC5D;IAEA;;GAEC,GACDC,iBAA2C;QACzC,OAAOd,KAAK,IAAI,CAACM,gBAAgB,GAAGG,MAAM,CAACM,WAAW;IACxD;IAEA,gFAAgF;IAChF,iBAAiB;IACjB,gFAAgF;IAEhF;;GAEC,GACDC,eAAeH,KAAc,EAA2B;QACtD,OAAOb,KAAK,IAAI,CAACM,gBAAgB,GAAGW,OAAO,CAACD,cAAc,CAACH;IAC7D;IAEA;;GAEC,GACDK,gBAAgBC,MAA4C,EAA6B;QACvF,OAAOnB,KAAK,IAAI,CAACM,gBAAgB,GAAGW,OAAO,CAACG,UAAU,CAACD;IACzD;IAEA;;GAEC,GACDE,eAAiC;QAC/B,OAAOrB,KAAK,IAAI,CAACM,gBAAgB,GAAGW,OAAO,CAACK,KAAK;IACnD;IAEA,gFAAgF;IAChF,YAAY;IACZ,gFAAgF;IAEhF;;GAEC,GACDC,gBAA8C;QAC5C,OAAOvB,KAAK,IAAI,CAACM,gBAAgB,GAAGkB,SAAS,CAACC,IAAI;IACpD;IAEA;;GAEC,GACDC,YAAYhB,OAA2B,EAA8B;QACnE,OAAOV,KAAK,IAAI,CAACM,gBAAgB,GAAGkB,SAAS,CAACG,GAAG,CAACjB;IACpD;IAEA;;GAEC,GACDkB,eAAeC,EAAU,EAAoB;QAC3C,OAAO7B,KAAK,IAAI,CAACM,gBAAgB,GAAGkB,SAAS,CAACM,MAAM,CAACD;IACvD;IAEA;;GAEC,GACDE,WAAWC,cAAsB,EAAuB;QACtD,OAAOhC,KAAK,IAAI,CAACM,gBAAgB,GAAGkB,SAAS,CAACO,UAAU,CAACC;IAC3D;IAEA,gFAAgF;IAChF,2CAA2C;IAC3C,gFAAgF;IAEhF;;GAEC,GACD,IAAIC,WAAwB;QAC1B,OAAO,IAAI,CAAC3B,gBAAgB;IAC9B;IAjHA4B,YACE,AAAsCC,gBAAkC,EACxE,AAA+BC,eAAiC,EAChE,AAAuBC,MAAyB,CAChD;QACA,MAAMC,YAAYH,2BAAAA,mBAAoBC;QACtC,IAAI,CAAC7B,KAAK,GAAG+B,YAAYrC,kBAAkBqC,WAAWD,UAAU;IAClE;AA2GF;AArHahC;IADZR,WAAW;QAAE0C,YAAY;IAAO;IAK5BxC,aAAAA;IAAYD,aAAAA,OAAOK;IACnBJ,aAAAA;IAAYD,aAAAA,OAAOI;IACnBJ,aAAAA,OAAOM;;;;;eAAuB,6CAAA;;GANtBC"}
@@ -1,7 +1,9 @@
1
1
  import { _ as _extends } from "@swc/helpers/_/_extends";
2
2
  import { InjectionToken, makeEnvironmentProviders } from '@angular/core';
3
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';
4
+ import { TRANSPORT, // Per-service transport tokens
5
+ AUTHENTICATION_TRANSPORT, SEARCH_TRANSPORT, PRODUCTS_TRANSPORT, CRM_TRANSPORT, CONTENT_TRANSPORT, GEOLOCATION_TRANSPORT, CONVERSATIONS_TRANSPORT, FILES_TRANSPORT, FORMS_TRANSPORT, ASSETS_TRANSPORT, CAMPAIGNS_TRANSPORT, COMPANY_TRANSPORT, REWARDS_TRANSPORT, SALES_TRANSPORT, WALLET_TRANSPORT, JARVIS_TRANSPORT, ONBOARDING_TRANSPORT, UNIVERSITY_TRANSPORT, // Config tokens
6
+ 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
7
  /**
6
8
  * Injection token for the token manager (internal use)
7
9
  */ export const TOKEN_MANAGER = new InjectionToken('23blocks.token-manager');
@@ -107,10 +109,10 @@ import { TRANSPORT, AUTHENTICATION_CONFIG, SEARCH_CONFIG, PRODUCTS_CONFIG, CRM_C
107
109
  };
108
110
  }
109
111
  /**
110
- * Create transport with automatic token handling
111
- */ function createTransportWithAuth(config, tokenManager) {
112
+ * Create transport with automatic token handling for a specific URL
113
+ */ function createTransportWithAuth(baseUrl, config, tokenManager) {
112
114
  return createHttpTransport({
113
- baseUrl: config.baseUrl,
115
+ baseUrl,
114
116
  timeout: config.timeout,
115
117
  credentials: config.authMode === 'cookie' ? 'include' : undefined,
116
118
  headers: ()=>{
@@ -137,7 +139,10 @@ import { TRANSPORT, AUTHENTICATION_CONFIG, SEARCH_CONFIG, PRODUCTS_CONFIG, CRM_C
137
139
  * This is the recommended way to set up 23blocks in new Angular applications.
138
140
  * It automatically handles token storage and authentication headers.
139
141
  *
140
- * @example Token mode (default)
142
+ * Services are only available if their URL is configured. Accessing a service
143
+ * without a configured URL will throw an error.
144
+ *
145
+ * @example Basic usage with multiple services
141
146
  * ```typescript
142
147
  * // app.config.ts
143
148
  * import { ApplicationConfig } from '@angular/core';
@@ -146,8 +151,12 @@ import { TRANSPORT, AUTHENTICATION_CONFIG, SEARCH_CONFIG, PRODUCTS_CONFIG, CRM_C
146
151
  * export const appConfig: ApplicationConfig = {
147
152
  * providers: [
148
153
  * provideBlocks23({
149
- * baseUrl: 'https://api.yourapp.com',
150
154
  * appId: 'your-app-id',
155
+ * urls: {
156
+ * authentication: 'https://gateway.23blocks.com',
157
+ * crm: 'https://crm.23blocks.com',
158
+ * products: 'https://products.23blocks.com',
159
+ * },
151
160
  * }),
152
161
  * ],
153
162
  * };
@@ -158,9 +167,12 @@ import { TRANSPORT, AUTHENTICATION_CONFIG, SEARCH_CONFIG, PRODUCTS_CONFIG, CRM_C
158
167
  * export const appConfig: ApplicationConfig = {
159
168
  * providers: [
160
169
  * provideBlocks23({
161
- * baseUrl: 'https://api.yourapp.com',
162
170
  * appId: 'your-app-id',
163
171
  * authMode: 'cookie',
172
+ * urls: {
173
+ * authentication: 'https://gateway.23blocks.com',
174
+ * crm: 'https://crm.23blocks.com',
175
+ * },
164
176
  * }),
165
177
  * ],
166
178
  * };
@@ -171,6 +183,17 @@ import { TRANSPORT, AUTHENTICATION_CONFIG, SEARCH_CONFIG, PRODUCTS_CONFIG, CRM_C
171
183
  appId: config.appId,
172
184
  tenantId: config.tenantId
173
185
  };
186
+ // Helper to create transport provider for a service URL
187
+ const createTransportProvider = (token, url)=>({
188
+ provide: token,
189
+ useFactory: (tokenManager)=>{
190
+ if (!url) return null;
191
+ return createTransportWithAuth(url, config, tokenManager);
192
+ },
193
+ deps: [
194
+ TOKEN_MANAGER
195
+ ]
196
+ });
174
197
  const providers = [
175
198
  // Store config for injection
176
199
  {
@@ -186,11 +209,41 @@ import { TRANSPORT, AUTHENTICATION_CONFIG, SEARCH_CONFIG, PRODUCTS_CONFIG, CRM_C
186
209
  return createTokenManager(config.appId, storage, config.tenantId);
187
210
  }
188
211
  },
189
- // Transport factory - depends on token manager
212
+ // Per-service transport factories (null if URL not configured)
213
+ createTransportProvider(AUTHENTICATION_TRANSPORT, config.urls.authentication),
214
+ createTransportProvider(SEARCH_TRANSPORT, config.urls.search),
215
+ createTransportProvider(PRODUCTS_TRANSPORT, config.urls.products),
216
+ createTransportProvider(CRM_TRANSPORT, config.urls.crm),
217
+ createTransportProvider(CONTENT_TRANSPORT, config.urls.content),
218
+ createTransportProvider(GEOLOCATION_TRANSPORT, config.urls.geolocation),
219
+ createTransportProvider(CONVERSATIONS_TRANSPORT, config.urls.conversations),
220
+ createTransportProvider(FILES_TRANSPORT, config.urls.files),
221
+ createTransportProvider(FORMS_TRANSPORT, config.urls.forms),
222
+ createTransportProvider(ASSETS_TRANSPORT, config.urls.assets),
223
+ createTransportProvider(CAMPAIGNS_TRANSPORT, config.urls.campaigns),
224
+ createTransportProvider(COMPANY_TRANSPORT, config.urls.company),
225
+ createTransportProvider(REWARDS_TRANSPORT, config.urls.rewards),
226
+ createTransportProvider(SALES_TRANSPORT, config.urls.sales),
227
+ createTransportProvider(WALLET_TRANSPORT, config.urls.wallet),
228
+ createTransportProvider(JARVIS_TRANSPORT, config.urls.jarvis),
229
+ createTransportProvider(ONBOARDING_TRANSPORT, config.urls.onboarding),
230
+ createTransportProvider(UNIVERSITY_TRANSPORT, config.urls.university),
231
+ // Backward compatibility: provide TRANSPORT token using auth URL if available
232
+ // (for advanced API users who still inject TRANSPORT directly)
190
233
  {
191
234
  provide: TRANSPORT,
192
235
  useFactory: (tokenManager)=>{
193
- return createTransportWithAuth(config, tokenManager);
236
+ // Use auth URL if available, otherwise create a dummy transport that throws
237
+ const url = config.urls.authentication;
238
+ if (url) {
239
+ return createTransportWithAuth(url, config, tokenManager);
240
+ }
241
+ // Return a transport that throws helpful errors
242
+ return {
243
+ request: ()=>{
244
+ throw new Error('[23blocks] TRANSPORT is not configured. ' + 'Use per-service transport tokens or configure urls.authentication.');
245
+ }
246
+ };
194
247
  },
195
248
  deps: [
196
249
  TOKEN_MANAGER
@@ -275,6 +328,9 @@ import { TRANSPORT, AUTHENTICATION_CONFIG, SEARCH_CONFIG, PRODUCTS_CONFIG, CRM_C
275
328
  /**
276
329
  * Get providers array for NgModule-based applications with simplified config.
277
330
  *
331
+ * Services are only available if their URL is configured. Accessing a service
332
+ * without a configured URL will throw an error.
333
+ *
278
334
  * @example
279
335
  * ```typescript
280
336
  * // app.module.ts
@@ -284,8 +340,11 @@ import { TRANSPORT, AUTHENTICATION_CONFIG, SEARCH_CONFIG, PRODUCTS_CONFIG, CRM_C
284
340
  * @NgModule({
285
341
  * providers: [
286
342
  * ...getBlocks23Providers({
287
- * baseUrl: 'https://api.yourapp.com',
288
343
  * appId: 'your-app-id',
344
+ * urls: {
345
+ * authentication: 'https://gateway.23blocks.com',
346
+ * crm: 'https://crm.23blocks.com',
347
+ * },
289
348
  * }),
290
349
  * ],
291
350
  * })
@@ -297,6 +356,17 @@ import { TRANSPORT, AUTHENTICATION_CONFIG, SEARCH_CONFIG, PRODUCTS_CONFIG, CRM_C
297
356
  appId: config.appId,
298
357
  tenantId: config.tenantId
299
358
  };
359
+ // Helper to create transport provider for a service URL
360
+ const createTransportProvider = (token, url)=>({
361
+ provide: token,
362
+ useFactory: (tokenManager)=>{
363
+ if (!url) return null;
364
+ return createTransportWithAuth(url, config, tokenManager);
365
+ },
366
+ deps: [
367
+ TOKEN_MANAGER
368
+ ]
369
+ });
300
370
  return [
301
371
  // Store config for injection
302
372
  {
@@ -312,11 +382,38 @@ import { TRANSPORT, AUTHENTICATION_CONFIG, SEARCH_CONFIG, PRODUCTS_CONFIG, CRM_C
312
382
  return createTokenManager(config.appId, storage, config.tenantId);
313
383
  }
314
384
  },
315
- // Transport factory - depends on token manager
385
+ // Per-service transport factories (null if URL not configured)
386
+ createTransportProvider(AUTHENTICATION_TRANSPORT, config.urls.authentication),
387
+ createTransportProvider(SEARCH_TRANSPORT, config.urls.search),
388
+ createTransportProvider(PRODUCTS_TRANSPORT, config.urls.products),
389
+ createTransportProvider(CRM_TRANSPORT, config.urls.crm),
390
+ createTransportProvider(CONTENT_TRANSPORT, config.urls.content),
391
+ createTransportProvider(GEOLOCATION_TRANSPORT, config.urls.geolocation),
392
+ createTransportProvider(CONVERSATIONS_TRANSPORT, config.urls.conversations),
393
+ createTransportProvider(FILES_TRANSPORT, config.urls.files),
394
+ createTransportProvider(FORMS_TRANSPORT, config.urls.forms),
395
+ createTransportProvider(ASSETS_TRANSPORT, config.urls.assets),
396
+ createTransportProvider(CAMPAIGNS_TRANSPORT, config.urls.campaigns),
397
+ createTransportProvider(COMPANY_TRANSPORT, config.urls.company),
398
+ createTransportProvider(REWARDS_TRANSPORT, config.urls.rewards),
399
+ createTransportProvider(SALES_TRANSPORT, config.urls.sales),
400
+ createTransportProvider(WALLET_TRANSPORT, config.urls.wallet),
401
+ createTransportProvider(JARVIS_TRANSPORT, config.urls.jarvis),
402
+ createTransportProvider(ONBOARDING_TRANSPORT, config.urls.onboarding),
403
+ createTransportProvider(UNIVERSITY_TRANSPORT, config.urls.university),
404
+ // Backward compatibility: provide TRANSPORT token using auth URL if available
316
405
  {
317
406
  provide: TRANSPORT,
318
407
  useFactory: (tokenManager)=>{
319
- return createTransportWithAuth(config, tokenManager);
408
+ const url = config.urls.authentication;
409
+ if (url) {
410
+ return createTransportWithAuth(url, config, tokenManager);
411
+ }
412
+ return {
413
+ request: ()=>{
414
+ throw new Error('[23blocks] TRANSPORT is not configured. ' + 'Use per-service transport tokens or configure urls.authentication.');
415
+ }
416
+ };
320
417
  },
321
418
  deps: [
322
419
  TOKEN_MANAGER
@@ -1 +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\n */\nexport type AuthMode = 'token' | 'cookie';\n\n/**\n * Storage type for token mode\n */\nexport type StorageType = 'localStorage' | 'sessionStorage' | 'memory';\n\n/**\n * Configuration for providing 23blocks services\n */\nexport interface ProviderConfig {\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 provider config\n */\nexport const PROVIDER_CONFIG = new InjectionToken<ProviderConfig>('23blocks.provider-config');\n\n/** @deprecated Use PROVIDER_CONFIG instead */\nexport const SIMPLE_CONFIG = PROVIDER_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: ProviderConfig, 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: ProviderConfig): 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: PROVIDER_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: ProviderConfig): 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: PROVIDER_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\n// ─────────────────────────────────────────────────────────────────────────────\n// Backward Compatibility Aliases (deprecated)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** @deprecated Use `ProviderConfig` instead */\nexport type Simple23BlocksConfig = ProviderConfig;\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","PROVIDER_CONFIG","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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"}
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 // Per-service transport tokens\n AUTHENTICATION_TRANSPORT,\n SEARCH_TRANSPORT,\n PRODUCTS_TRANSPORT,\n CRM_TRANSPORT,\n CONTENT_TRANSPORT,\n GEOLOCATION_TRANSPORT,\n CONVERSATIONS_TRANSPORT,\n FILES_TRANSPORT,\n FORMS_TRANSPORT,\n ASSETS_TRANSPORT,\n CAMPAIGNS_TRANSPORT,\n COMPANY_TRANSPORT,\n REWARDS_TRANSPORT,\n SALES_TRANSPORT,\n WALLET_TRANSPORT,\n JARVIS_TRANSPORT,\n ONBOARDING_TRANSPORT,\n UNIVERSITY_TRANSPORT,\n // Config tokens\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\n */\nexport type AuthMode = 'token' | 'cookie';\n\n/**\n * Storage type for token mode\n */\nexport type StorageType = 'localStorage' | 'sessionStorage' | 'memory';\n\n/**\n * Service URL configuration - each microservice has its own URL.\n * All URLs are optional - only configure the services you need.\n */\nexport interface ServiceUrls {\n /** Authentication service URL */\n authentication?: string;\n /** Search service URL */\n search?: string;\n /** Products service URL */\n products?: string;\n /** CRM service URL */\n crm?: string;\n /** Content service URL */\n content?: string;\n /** Geolocation service URL */\n geolocation?: string;\n /** Conversations service URL */\n conversations?: string;\n /** Files service URL */\n files?: string;\n /** Forms service URL */\n forms?: string;\n /** Assets service URL */\n assets?: string;\n /** Campaigns service URL */\n campaigns?: string;\n /** Company service URL */\n company?: string;\n /** Rewards service URL */\n rewards?: string;\n /** Sales service URL */\n sales?: string;\n /** Wallet service URL */\n wallet?: string;\n /** Jarvis (AI) service URL */\n jarvis?: string;\n /** Onboarding service URL */\n onboarding?: string;\n /** University (LMS) service URL */\n university?: string;\n}\n\n/**\n * Configuration for providing 23blocks services\n */\nexport interface ProviderConfig {\n /**\n * Service URLs for each microservice.\n * Only configure the services you need - accessing a service without\n * a configured URL will throw an error.\n *\n * @example\n * ```typescript\n * provideBlocks23({\n * appId: 'your-app-id',\n * urls: {\n * authentication: 'https://gateway.23blocks.com',\n * crm: 'https://crm.23blocks.com',\n * products: 'https://products.23blocks.com',\n * },\n * })\n * ```\n */\n urls: ServiceUrls;\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 provider config\n */\nexport const PROVIDER_CONFIG = new InjectionToken<ProviderConfig>('23blocks.provider-config');\n\n/** @deprecated Use PROVIDER_CONFIG instead */\nexport const SIMPLE_CONFIG = PROVIDER_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 for a specific URL\n */\nfunction createTransportWithAuth(\n baseUrl: string,\n config: ProviderConfig,\n tokenManager: TokenManagerService\n): Transport {\n return createHttpTransport({\n 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 * Services are only available if their URL is configured. Accessing a service\n * without a configured URL will throw an error.\n *\n * @example Basic usage with multiple services\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 * appId: 'your-app-id',\n * urls: {\n * authentication: 'https://gateway.23blocks.com',\n * crm: 'https://crm.23blocks.com',\n * products: 'https://products.23blocks.com',\n * },\n * }),\n * ],\n * };\n * ```\n *\n * @example Cookie mode (recommended for security)\n * ```typescript\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideBlocks23({\n * appId: 'your-app-id',\n * authMode: 'cookie',\n * urls: {\n * authentication: 'https://gateway.23blocks.com',\n * crm: 'https://crm.23blocks.com',\n * },\n * }),\n * ],\n * };\n * ```\n */\nexport function provideBlocks23(config: ProviderConfig): EnvironmentProviders {\n // Block config for all services\n const blockConfig = { appId: config.appId, tenantId: config.tenantId };\n\n // Helper to create transport provider for a service URL\n const createTransportProvider = (\n token: InjectionToken<Transport | null>,\n url: string | undefined\n ): Provider => ({\n provide: token,\n useFactory: (tokenManager: TokenManagerService) => {\n if (!url) return null;\n return createTransportWithAuth(url, config, tokenManager);\n },\n deps: [TOKEN_MANAGER],\n });\n\n const providers: Provider[] = [\n // Store config for injection\n { provide: PROVIDER_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 // Per-service transport factories (null if URL not configured)\n createTransportProvider(AUTHENTICATION_TRANSPORT, config.urls.authentication),\n createTransportProvider(SEARCH_TRANSPORT, config.urls.search),\n createTransportProvider(PRODUCTS_TRANSPORT, config.urls.products),\n createTransportProvider(CRM_TRANSPORT, config.urls.crm),\n createTransportProvider(CONTENT_TRANSPORT, config.urls.content),\n createTransportProvider(GEOLOCATION_TRANSPORT, config.urls.geolocation),\n createTransportProvider(CONVERSATIONS_TRANSPORT, config.urls.conversations),\n createTransportProvider(FILES_TRANSPORT, config.urls.files),\n createTransportProvider(FORMS_TRANSPORT, config.urls.forms),\n createTransportProvider(ASSETS_TRANSPORT, config.urls.assets),\n createTransportProvider(CAMPAIGNS_TRANSPORT, config.urls.campaigns),\n createTransportProvider(COMPANY_TRANSPORT, config.urls.company),\n createTransportProvider(REWARDS_TRANSPORT, config.urls.rewards),\n createTransportProvider(SALES_TRANSPORT, config.urls.sales),\n createTransportProvider(WALLET_TRANSPORT, config.urls.wallet),\n createTransportProvider(JARVIS_TRANSPORT, config.urls.jarvis),\n createTransportProvider(ONBOARDING_TRANSPORT, config.urls.onboarding),\n createTransportProvider(UNIVERSITY_TRANSPORT, config.urls.university),\n\n // Backward compatibility: provide TRANSPORT token using auth URL if available\n // (for advanced API users who still inject TRANSPORT directly)\n {\n provide: TRANSPORT,\n useFactory: (tokenManager: TokenManagerService) => {\n // Use auth URL if available, otherwise create a dummy transport that throws\n const url = config.urls.authentication;\n if (url) {\n return createTransportWithAuth(url, config, tokenManager);\n }\n // Return a transport that throws helpful errors\n return {\n request: () => {\n throw new Error(\n '[23blocks] TRANSPORT is not configured. ' +\n 'Use per-service transport tokens or configure urls.authentication.'\n );\n },\n };\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 * Services are only available if their URL is configured. Accessing a service\n * without a configured URL will throw an error.\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 * appId: 'your-app-id',\n * urls: {\n * authentication: 'https://gateway.23blocks.com',\n * crm: 'https://crm.23blocks.com',\n * },\n * }),\n * ],\n * })\n * export class AppModule {}\n * ```\n */\nexport function getBlocks23Providers(config: ProviderConfig): Provider[] {\n // Block config for all services\n const blockConfig = { appId: config.appId, tenantId: config.tenantId };\n\n // Helper to create transport provider for a service URL\n const createTransportProvider = (\n token: InjectionToken<Transport | null>,\n url: string | undefined\n ): Provider => ({\n provide: token,\n useFactory: (tokenManager: TokenManagerService) => {\n if (!url) return null;\n return createTransportWithAuth(url, config, tokenManager);\n },\n deps: [TOKEN_MANAGER],\n });\n\n return [\n // Store config for injection\n { provide: PROVIDER_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 // Per-service transport factories (null if URL not configured)\n createTransportProvider(AUTHENTICATION_TRANSPORT, config.urls.authentication),\n createTransportProvider(SEARCH_TRANSPORT, config.urls.search),\n createTransportProvider(PRODUCTS_TRANSPORT, config.urls.products),\n createTransportProvider(CRM_TRANSPORT, config.urls.crm),\n createTransportProvider(CONTENT_TRANSPORT, config.urls.content),\n createTransportProvider(GEOLOCATION_TRANSPORT, config.urls.geolocation),\n createTransportProvider(CONVERSATIONS_TRANSPORT, config.urls.conversations),\n createTransportProvider(FILES_TRANSPORT, config.urls.files),\n createTransportProvider(FORMS_TRANSPORT, config.urls.forms),\n createTransportProvider(ASSETS_TRANSPORT, config.urls.assets),\n createTransportProvider(CAMPAIGNS_TRANSPORT, config.urls.campaigns),\n createTransportProvider(COMPANY_TRANSPORT, config.urls.company),\n createTransportProvider(REWARDS_TRANSPORT, config.urls.rewards),\n createTransportProvider(SALES_TRANSPORT, config.urls.sales),\n createTransportProvider(WALLET_TRANSPORT, config.urls.wallet),\n createTransportProvider(JARVIS_TRANSPORT, config.urls.jarvis),\n createTransportProvider(ONBOARDING_TRANSPORT, config.urls.onboarding),\n createTransportProvider(UNIVERSITY_TRANSPORT, config.urls.university),\n\n // Backward compatibility: provide TRANSPORT token using auth URL if available\n {\n provide: TRANSPORT,\n useFactory: (tokenManager: TokenManagerService) => {\n const url = config.urls.authentication;\n if (url) {\n return createTransportWithAuth(url, config, tokenManager);\n }\n return {\n request: () => {\n throw new Error(\n '[23blocks] TRANSPORT is not configured. ' +\n 'Use per-service transport tokens or configure urls.authentication.'\n );\n },\n };\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\n// ─────────────────────────────────────────────────────────────────────────────\n// Backward Compatibility Aliases (deprecated)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** @deprecated Use `ProviderConfig` instead */\nexport type Simple23BlocksConfig = ProviderConfig;\n"],"names":["InjectionToken","makeEnvironmentProviders","createHttpTransport","TRANSPORT","AUTHENTICATION_TRANSPORT","SEARCH_TRANSPORT","PRODUCTS_TRANSPORT","CRM_TRANSPORT","CONTENT_TRANSPORT","GEOLOCATION_TRANSPORT","CONVERSATIONS_TRANSPORT","FILES_TRANSPORT","FORMS_TRANSPORT","ASSETS_TRANSPORT","CAMPAIGNS_TRANSPORT","COMPANY_TRANSPORT","REWARDS_TRANSPORT","SALES_TRANSPORT","WALLET_TRANSPORT","JARVIS_TRANSPORT","ONBOARDING_TRANSPORT","UNIVERSITY_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","PROVIDER_CONFIG","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","baseUrl","config","tokenManager","timeout","credentials","authMode","undefined","headers","appid","token","provideBlocks23","blockConfig","createTransportProvider","url","provide","useFactory","deps","providers","useValue","urls","authentication","search","products","crm","content","geolocation","conversations","files","forms","assets","campaigns","company","rewards","sales","wallet","jarvis","onboarding","university","request","Error","getBlocks23Providers"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1,7 +1,32 @@
1
1
  import { InjectionToken } from '@angular/core';
2
+ // ─────────────────────────────────────────────────────────────────────────────
3
+ // Transport Tokens (per-service)
4
+ // ─────────────────────────────────────────────────────────────────────────────
2
5
  /**
3
- * Injection token for the Transport instance
6
+ * @deprecated Use per-service transport tokens (AUTHENTICATION_TRANSPORT, etc.)
7
+ * Shared transport token - only for backward compatibility with advanced API
4
8
  */ export const TRANSPORT = new InjectionToken('23blocks.transport');
9
+ /** Transport for Authentication service */ export const AUTHENTICATION_TRANSPORT = new InjectionToken('23blocks.authentication.transport');
10
+ /** Transport for Search service */ export const SEARCH_TRANSPORT = new InjectionToken('23blocks.search.transport');
11
+ /** Transport for Products service */ export const PRODUCTS_TRANSPORT = new InjectionToken('23blocks.products.transport');
12
+ /** Transport for CRM service */ export const CRM_TRANSPORT = new InjectionToken('23blocks.crm.transport');
13
+ /** Transport for Content service */ export const CONTENT_TRANSPORT = new InjectionToken('23blocks.content.transport');
14
+ /** Transport for Geolocation service */ export const GEOLOCATION_TRANSPORT = new InjectionToken('23blocks.geolocation.transport');
15
+ /** Transport for Conversations service */ export const CONVERSATIONS_TRANSPORT = new InjectionToken('23blocks.conversations.transport');
16
+ /** Transport for Files service */ export const FILES_TRANSPORT = new InjectionToken('23blocks.files.transport');
17
+ /** Transport for Forms service */ export const FORMS_TRANSPORT = new InjectionToken('23blocks.forms.transport');
18
+ /** Transport for Assets service */ export const ASSETS_TRANSPORT = new InjectionToken('23blocks.assets.transport');
19
+ /** Transport for Campaigns service */ export const CAMPAIGNS_TRANSPORT = new InjectionToken('23blocks.campaigns.transport');
20
+ /** Transport for Company service */ export const COMPANY_TRANSPORT = new InjectionToken('23blocks.company.transport');
21
+ /** Transport for Rewards service */ export const REWARDS_TRANSPORT = new InjectionToken('23blocks.rewards.transport');
22
+ /** Transport for Sales service */ export const SALES_TRANSPORT = new InjectionToken('23blocks.sales.transport');
23
+ /** Transport for Wallet service */ export const WALLET_TRANSPORT = new InjectionToken('23blocks.wallet.transport');
24
+ /** Transport for Jarvis service */ export const JARVIS_TRANSPORT = new InjectionToken('23blocks.jarvis.transport');
25
+ /** Transport for Onboarding service */ export const ONBOARDING_TRANSPORT = new InjectionToken('23blocks.onboarding.transport');
26
+ /** Transport for University service */ export const UNIVERSITY_TRANSPORT = new InjectionToken('23blocks.university.transport');
27
+ // ─────────────────────────────────────────────────────────────────────────────
28
+ // Config Tokens (per-service)
29
+ // ─────────────────────────────────────────────────────────────────────────────
5
30
  /**
6
31
  * Injection token for Authentication block configuration
7
32
  */ export const AUTHENTICATION_CONFIG = new InjectionToken('23blocks.authentication.config');
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/tokens.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport type { Transport } from '@23blocks/contracts';\nimport type { AuthenticationBlockConfig } from '@23blocks/block-authentication';\nimport type { SearchBlockConfig } from '@23blocks/block-search';\nimport type { GeolocationBlockConfig } from '@23blocks/block-geolocation';\nimport type { ContentBlockConfig } from '@23blocks/block-content';\nimport type { CrmBlockConfig } from '@23blocks/block-crm';\nimport type { ProductsBlockConfig } from '@23blocks/block-products';\nimport type { ConversationsBlockConfig } from '@23blocks/block-conversations';\nimport type { FilesBlockConfig } from '@23blocks/block-files';\nimport type { AssetsBlockConfig } from '@23blocks/block-assets';\nimport type { FormsBlockConfig } from '@23blocks/block-forms';\nimport type { SalesBlockConfig } from '@23blocks/block-sales';\nimport type { CampaignsBlockConfig } from '@23blocks/block-campaigns';\nimport type { CompanyBlockConfig } from '@23blocks/block-company';\nimport type { RewardsBlockConfig } from '@23blocks/block-rewards';\nimport type { JarvisBlockConfig } from '@23blocks/block-jarvis';\nimport type { OnboardingBlockConfig } from '@23blocks/block-onboarding';\nimport type { UniversityBlockConfig } from '@23blocks/block-university';\nimport type { WalletBlockConfig } from '@23blocks/block-wallet';\n\n/**\n * Injection token for the Transport instance\n */\nexport const TRANSPORT = new InjectionToken<Transport>('23blocks.transport');\n\n/**\n * Injection token for Authentication block configuration\n */\nexport const AUTHENTICATION_CONFIG = new InjectionToken<AuthenticationBlockConfig>(\n '23blocks.authentication.config'\n);\n\n/**\n * Injection token for Search block configuration\n */\nexport const SEARCH_CONFIG = new InjectionToken<SearchBlockConfig>(\n '23blocks.search.config'\n);\n\n/**\n * Injection token for Geolocation block configuration\n */\nexport const GEOLOCATION_CONFIG = new InjectionToken<GeolocationBlockConfig>(\n '23blocks.geolocation.config'\n);\n\n/**\n * Injection token for Content block configuration\n */\nexport const CONTENT_CONFIG = new InjectionToken<ContentBlockConfig>(\n '23blocks.content.config'\n);\n\n/**\n * Injection token for CRM block configuration\n */\nexport const CRM_CONFIG = new InjectionToken<CrmBlockConfig>(\n '23blocks.crm.config'\n);\n\n/**\n * Injection token for Products block configuration\n */\nexport const PRODUCTS_CONFIG = new InjectionToken<ProductsBlockConfig>(\n '23blocks.products.config'\n);\n\n/**\n * Injection token for Conversations block configuration\n */\nexport const CONVERSATIONS_CONFIG = new InjectionToken<ConversationsBlockConfig>(\n '23blocks.conversations.config'\n);\n\n/**\n * Injection token for Files block configuration\n */\nexport const FILES_CONFIG = new InjectionToken<FilesBlockConfig>(\n '23blocks.files.config'\n);\n\n/**\n * Injection token for Assets block configuration\n */\nexport const ASSETS_CONFIG = new InjectionToken<AssetsBlockConfig>(\n '23blocks.assets.config'\n);\n\n/**\n * Injection token for Forms block configuration\n */\nexport const FORMS_CONFIG = new InjectionToken<FormsBlockConfig>(\n '23blocks.forms.config'\n);\n\n/**\n * Injection token for Sales block configuration\n */\nexport const SALES_CONFIG = new InjectionToken<SalesBlockConfig>(\n '23blocks.sales.config'\n);\n\n/**\n * Injection token for Campaigns block configuration\n */\nexport const CAMPAIGNS_CONFIG = new InjectionToken<CampaignsBlockConfig>(\n '23blocks.campaigns.config'\n);\n\n/**\n * Injection token for Company block configuration\n */\nexport const COMPANY_CONFIG = new InjectionToken<CompanyBlockConfig>(\n '23blocks.company.config'\n);\n\n/**\n * Injection token for Rewards block configuration\n */\nexport const REWARDS_CONFIG = new InjectionToken<RewardsBlockConfig>(\n '23blocks.rewards.config'\n);\n\n/**\n * Injection token for Jarvis block configuration\n */\nexport const JARVIS_CONFIG = new InjectionToken<JarvisBlockConfig>(\n '23blocks.jarvis.config'\n);\n\n/**\n * Injection token for Onboarding block configuration\n */\nexport const ONBOARDING_CONFIG = new InjectionToken<OnboardingBlockConfig>(\n '23blocks.onboarding.config'\n);\n\n/**\n * Injection token for University block configuration\n */\nexport const UNIVERSITY_CONFIG = new InjectionToken<UniversityBlockConfig>(\n '23blocks.university.config'\n);\n\n/**\n * Injection token for Wallet block configuration\n */\nexport const WALLET_CONFIG = new InjectionToken<WalletBlockConfig>(\n '23blocks.wallet.config'\n);\n"],"names":["InjectionToken","TRANSPORT","AUTHENTICATION_CONFIG","SEARCH_CONFIG","GEOLOCATION_CONFIG","CONTENT_CONFIG","CRM_CONFIG","PRODUCTS_CONFIG","CONVERSATIONS_CONFIG","FILES_CONFIG","ASSETS_CONFIG","FORMS_CONFIG","SALES_CONFIG","CAMPAIGNS_CONFIG","COMPANY_CONFIG","REWARDS_CONFIG","JARVIS_CONFIG","ONBOARDING_CONFIG","UNIVERSITY_CONFIG","WALLET_CONFIG"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,cAAc,QAAQ,gBAAgB;AAqB/C;;CAEC,GACD,OAAO,MAAMC,YAAY,IAAID,eAA0B,sBAAsB;AAE7E;;CAEC,GACD,OAAO,MAAME,wBAAwB,IAAIF,eACvC,kCACA;AAEF;;CAEC,GACD,OAAO,MAAMG,gBAAgB,IAAIH,eAC/B,0BACA;AAEF;;CAEC,GACD,OAAO,MAAMI,qBAAqB,IAAIJ,eACpC,+BACA;AAEF;;CAEC,GACD,OAAO,MAAMK,iBAAiB,IAAIL,eAChC,2BACA;AAEF;;CAEC,GACD,OAAO,MAAMM,aAAa,IAAIN,eAC5B,uBACA;AAEF;;CAEC,GACD,OAAO,MAAMO,kBAAkB,IAAIP,eACjC,4BACA;AAEF;;CAEC,GACD,OAAO,MAAMQ,uBAAuB,IAAIR,eACtC,iCACA;AAEF;;CAEC,GACD,OAAO,MAAMS,eAAe,IAAIT,eAC9B,yBACA;AAEF;;CAEC,GACD,OAAO,MAAMU,gBAAgB,IAAIV,eAC/B,0BACA;AAEF;;CAEC,GACD,OAAO,MAAMW,eAAe,IAAIX,eAC9B,yBACA;AAEF;;CAEC,GACD,OAAO,MAAMY,eAAe,IAAIZ,eAC9B,yBACA;AAEF;;CAEC,GACD,OAAO,MAAMa,mBAAmB,IAAIb,eAClC,6BACA;AAEF;;CAEC,GACD,OAAO,MAAMc,iBAAiB,IAAId,eAChC,2BACA;AAEF;;CAEC,GACD,OAAO,MAAMe,iBAAiB,IAAIf,eAChC,2BACA;AAEF;;CAEC,GACD,OAAO,MAAMgB,gBAAgB,IAAIhB,eAC/B,0BACA;AAEF;;CAEC,GACD,OAAO,MAAMiB,oBAAoB,IAAIjB,eACnC,8BACA;AAEF;;CAEC,GACD,OAAO,MAAMkB,oBAAoB,IAAIlB,eACnC,8BACA;AAEF;;CAEC,GACD,OAAO,MAAMmB,gBAAgB,IAAInB,eAC/B,0BACA"}
1
+ {"version":3,"sources":["../../src/lib/tokens.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport type { Transport } from '@23blocks/contracts';\nimport type { AuthenticationBlockConfig } from '@23blocks/block-authentication';\nimport type { SearchBlockConfig } from '@23blocks/block-search';\nimport type { GeolocationBlockConfig } from '@23blocks/block-geolocation';\nimport type { ContentBlockConfig } from '@23blocks/block-content';\nimport type { CrmBlockConfig } from '@23blocks/block-crm';\nimport type { ProductsBlockConfig } from '@23blocks/block-products';\nimport type { ConversationsBlockConfig } from '@23blocks/block-conversations';\nimport type { FilesBlockConfig } from '@23blocks/block-files';\nimport type { AssetsBlockConfig } from '@23blocks/block-assets';\nimport type { FormsBlockConfig } from '@23blocks/block-forms';\nimport type { SalesBlockConfig } from '@23blocks/block-sales';\nimport type { CampaignsBlockConfig } from '@23blocks/block-campaigns';\nimport type { CompanyBlockConfig } from '@23blocks/block-company';\nimport type { RewardsBlockConfig } from '@23blocks/block-rewards';\nimport type { JarvisBlockConfig } from '@23blocks/block-jarvis';\nimport type { OnboardingBlockConfig } from '@23blocks/block-onboarding';\nimport type { UniversityBlockConfig } from '@23blocks/block-university';\nimport type { WalletBlockConfig } from '@23blocks/block-wallet';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Transport Tokens (per-service)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * @deprecated Use per-service transport tokens (AUTHENTICATION_TRANSPORT, etc.)\n * Shared transport token - only for backward compatibility with advanced API\n */\nexport const TRANSPORT = new InjectionToken<Transport>('23blocks.transport');\n\n/** Transport for Authentication service */\nexport const AUTHENTICATION_TRANSPORT = new InjectionToken<Transport | null>('23blocks.authentication.transport');\n\n/** Transport for Search service */\nexport const SEARCH_TRANSPORT = new InjectionToken<Transport | null>('23blocks.search.transport');\n\n/** Transport for Products service */\nexport const PRODUCTS_TRANSPORT = new InjectionToken<Transport | null>('23blocks.products.transport');\n\n/** Transport for CRM service */\nexport const CRM_TRANSPORT = new InjectionToken<Transport | null>('23blocks.crm.transport');\n\n/** Transport for Content service */\nexport const CONTENT_TRANSPORT = new InjectionToken<Transport | null>('23blocks.content.transport');\n\n/** Transport for Geolocation service */\nexport const GEOLOCATION_TRANSPORT = new InjectionToken<Transport | null>('23blocks.geolocation.transport');\n\n/** Transport for Conversations service */\nexport const CONVERSATIONS_TRANSPORT = new InjectionToken<Transport | null>('23blocks.conversations.transport');\n\n/** Transport for Files service */\nexport const FILES_TRANSPORT = new InjectionToken<Transport | null>('23blocks.files.transport');\n\n/** Transport for Forms service */\nexport const FORMS_TRANSPORT = new InjectionToken<Transport | null>('23blocks.forms.transport');\n\n/** Transport for Assets service */\nexport const ASSETS_TRANSPORT = new InjectionToken<Transport | null>('23blocks.assets.transport');\n\n/** Transport for Campaigns service */\nexport const CAMPAIGNS_TRANSPORT = new InjectionToken<Transport | null>('23blocks.campaigns.transport');\n\n/** Transport for Company service */\nexport const COMPANY_TRANSPORT = new InjectionToken<Transport | null>('23blocks.company.transport');\n\n/** Transport for Rewards service */\nexport const REWARDS_TRANSPORT = new InjectionToken<Transport | null>('23blocks.rewards.transport');\n\n/** Transport for Sales service */\nexport const SALES_TRANSPORT = new InjectionToken<Transport | null>('23blocks.sales.transport');\n\n/** Transport for Wallet service */\nexport const WALLET_TRANSPORT = new InjectionToken<Transport | null>('23blocks.wallet.transport');\n\n/** Transport for Jarvis service */\nexport const JARVIS_TRANSPORT = new InjectionToken<Transport | null>('23blocks.jarvis.transport');\n\n/** Transport for Onboarding service */\nexport const ONBOARDING_TRANSPORT = new InjectionToken<Transport | null>('23blocks.onboarding.transport');\n\n/** Transport for University service */\nexport const UNIVERSITY_TRANSPORT = new InjectionToken<Transport | null>('23blocks.university.transport');\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Config Tokens (per-service)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Injection token for Authentication block configuration\n */\nexport const AUTHENTICATION_CONFIG = new InjectionToken<AuthenticationBlockConfig>(\n '23blocks.authentication.config'\n);\n\n/**\n * Injection token for Search block configuration\n */\nexport const SEARCH_CONFIG = new InjectionToken<SearchBlockConfig>(\n '23blocks.search.config'\n);\n\n/**\n * Injection token for Geolocation block configuration\n */\nexport const GEOLOCATION_CONFIG = new InjectionToken<GeolocationBlockConfig>(\n '23blocks.geolocation.config'\n);\n\n/**\n * Injection token for Content block configuration\n */\nexport const CONTENT_CONFIG = new InjectionToken<ContentBlockConfig>(\n '23blocks.content.config'\n);\n\n/**\n * Injection token for CRM block configuration\n */\nexport const CRM_CONFIG = new InjectionToken<CrmBlockConfig>(\n '23blocks.crm.config'\n);\n\n/**\n * Injection token for Products block configuration\n */\nexport const PRODUCTS_CONFIG = new InjectionToken<ProductsBlockConfig>(\n '23blocks.products.config'\n);\n\n/**\n * Injection token for Conversations block configuration\n */\nexport const CONVERSATIONS_CONFIG = new InjectionToken<ConversationsBlockConfig>(\n '23blocks.conversations.config'\n);\n\n/**\n * Injection token for Files block configuration\n */\nexport const FILES_CONFIG = new InjectionToken<FilesBlockConfig>(\n '23blocks.files.config'\n);\n\n/**\n * Injection token for Assets block configuration\n */\nexport const ASSETS_CONFIG = new InjectionToken<AssetsBlockConfig>(\n '23blocks.assets.config'\n);\n\n/**\n * Injection token for Forms block configuration\n */\nexport const FORMS_CONFIG = new InjectionToken<FormsBlockConfig>(\n '23blocks.forms.config'\n);\n\n/**\n * Injection token for Sales block configuration\n */\nexport const SALES_CONFIG = new InjectionToken<SalesBlockConfig>(\n '23blocks.sales.config'\n);\n\n/**\n * Injection token for Campaigns block configuration\n */\nexport const CAMPAIGNS_CONFIG = new InjectionToken<CampaignsBlockConfig>(\n '23blocks.campaigns.config'\n);\n\n/**\n * Injection token for Company block configuration\n */\nexport const COMPANY_CONFIG = new InjectionToken<CompanyBlockConfig>(\n '23blocks.company.config'\n);\n\n/**\n * Injection token for Rewards block configuration\n */\nexport const REWARDS_CONFIG = new InjectionToken<RewardsBlockConfig>(\n '23blocks.rewards.config'\n);\n\n/**\n * Injection token for Jarvis block configuration\n */\nexport const JARVIS_CONFIG = new InjectionToken<JarvisBlockConfig>(\n '23blocks.jarvis.config'\n);\n\n/**\n * Injection token for Onboarding block configuration\n */\nexport const ONBOARDING_CONFIG = new InjectionToken<OnboardingBlockConfig>(\n '23blocks.onboarding.config'\n);\n\n/**\n * Injection token for University block configuration\n */\nexport const UNIVERSITY_CONFIG = new InjectionToken<UniversityBlockConfig>(\n '23blocks.university.config'\n);\n\n/**\n * Injection token for Wallet block configuration\n */\nexport const WALLET_CONFIG = new InjectionToken<WalletBlockConfig>(\n '23blocks.wallet.config'\n);\n"],"names":["InjectionToken","TRANSPORT","AUTHENTICATION_TRANSPORT","SEARCH_TRANSPORT","PRODUCTS_TRANSPORT","CRM_TRANSPORT","CONTENT_TRANSPORT","GEOLOCATION_TRANSPORT","CONVERSATIONS_TRANSPORT","FILES_TRANSPORT","FORMS_TRANSPORT","ASSETS_TRANSPORT","CAMPAIGNS_TRANSPORT","COMPANY_TRANSPORT","REWARDS_TRANSPORT","SALES_TRANSPORT","WALLET_TRANSPORT","JARVIS_TRANSPORT","ONBOARDING_TRANSPORT","UNIVERSITY_TRANSPORT","AUTHENTICATION_CONFIG","SEARCH_CONFIG","GEOLOCATION_CONFIG","CONTENT_CONFIG","CRM_CONFIG","PRODUCTS_CONFIG","CONVERSATIONS_CONFIG","FILES_CONFIG","ASSETS_CONFIG","FORMS_CONFIG","SALES_CONFIG","CAMPAIGNS_CONFIG","COMPANY_CONFIG","REWARDS_CONFIG","JARVIS_CONFIG","ONBOARDING_CONFIG","UNIVERSITY_CONFIG","WALLET_CONFIG"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}