@capitalos/angular 0.1.0-rc.1 → 0.1.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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, Injectable, EventEmitter, Component, Input, Output, ViewChild, NgModule } from '@angular/core';
2
+ import { InjectionToken, inject, Injectable, EventEmitter, Directive, Input, Output, ViewChild, Component, NgModule } from '@angular/core';
3
3
  import { exchangeOneTimeToken, TokenType, TokenParamKey, TokenParamLocation, createLogger, IframeManager, CapitalOSError } from '@capitalos/core';
4
4
  export { CapitalOSError, ErrorCode } from '@capitalos/core';
5
5
  import { BehaviorSubject, combineLatest, map } from 'rxjs';
@@ -218,30 +218,73 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
218
218
  type: Injectable
219
219
  }], ctorParameters: function () { return []; } });
220
220
 
221
- // TODO: Automate version injection at build time
222
- const SDK_VERSION = '0.1.0-rc.1';
221
+ // AUTO-GENERATED FILE - DO NOT EDIT
222
+ // Generated by: scripts/generate-version.js
223
+ // Source: projects/capitalos-angular/package.json
224
+ const SDK_VERSION = '0.1.1';
225
+
223
226
  /**
224
- * CardsApp component that renders the CapitalOS cards interface in an iframe.
227
+ * Common template for all iframe components.
228
+ * Angular doesn't support inheriting templates, so subclasses must use this constant.
229
+ */
230
+ const IFRAME_COMPONENT_TEMPLATE = `<div #iframeContainer class="capitalos-iframe-container"></div>`;
231
+ /**
232
+ * Common styles for all iframe components.
233
+ * Angular doesn't support inheriting styles, so subclasses must use this constant.
225
234
  *
226
- * The component emits events for loading state - consumers should handle their own loading UI:
235
+ * Why Angular needs these styles (unlike React/Vue):
236
+ * Angular component selectors (e.g., <capitalos-cards-app>) remain in the DOM as real elements.
237
+ * Without :host styling, the component element may collapse or not fill its container.
238
+ * In React/Vue, component tags are replaced by rendered content, so no wrapper styling is needed.
239
+ */
240
+ const IFRAME_COMPONENT_STYLES = [
241
+ `
242
+ :host {
243
+ display: block;
244
+ width: 100%;
245
+ }
246
+
247
+ .capitalos-iframe-container {
248
+ width: 100%;
249
+ }
250
+ `,
251
+ ];
252
+ /**
253
+ * Abstract base class for CapitalOS iframe components.
227
254
  *
228
- * ```html
229
- * <div *ngIf="!cardsLoaded">
230
- * <my-loading-spinner></my-loading-spinner>
231
- * </div>
232
- * <capitalos-cards-app
233
- * (loaded)="cardsLoaded = true"
234
- * (error)="onCardsError($event)"
235
- * ></capitalos-cards-app>
255
+ * Handles common functionality:
256
+ * - Token subscription and iframe initialization
257
+ * - Common inputs (theme, heightOffsetPx, enableLogging)
258
+ * - Common outputs (loaded, error)
259
+ * - Lifecycle management (cleanup on destroy)
260
+ *
261
+ * Subclasses must implement:
262
+ * - `getRenderingContext()` - returns the component-specific rendering context
263
+ *
264
+ * Subclasses may override:
265
+ * - `getComponentCallbacks()` - returns component-specific Penpal callbacks
266
+ *
267
+ * Note: Rendering context inputs (e.g., entryPoint, exitPoint for Onboarding) are read once
268
+ * at iframe initialization. Changes to these inputs after the iframe loads will NOT trigger
269
+ * re-initialization. This matches the behavior of the React SDK.
270
+ *
271
+ * @example
272
+ * ```typescript
273
+ * @Component({ selector: 'my-component', ... })
274
+ * export class MyComponent extends BaseIframeComponent {
275
+ * protected getRenderingContext(): RenderingContext {
276
+ * return { entryPoint: 'myComponent' }
277
+ * }
278
+ * }
236
279
  * ```
237
280
  */
238
- class CardsAppComponent {
281
+ class BaseIframeComponent {
239
282
  constructor() {
240
283
  // Injected services
241
284
  this.authService = inject(CapitalOsAuthService);
242
285
  this.config = inject(CAPITALOS_CONFIG);
243
286
  this.heightOffsetPx = 12;
244
- // Outputs
287
+ // Common outputs
245
288
  this.loaded = new EventEmitter();
246
289
  this.error = new EventEmitter();
247
290
  }
@@ -257,6 +300,13 @@ class CardsAppComponent {
257
300
  this.tokenDataSubscription?.unsubscribe();
258
301
  this.iframeManager?.destroy();
259
302
  }
303
+ /**
304
+ * Returns component-specific Penpal callbacks.
305
+ * Override in subclasses that need callbacks (e.g., Onboarding, TokenExchange).
306
+ */
307
+ getComponentCallbacks() {
308
+ return {};
309
+ }
260
310
  initializeIframe(tokenData, container) {
261
311
  // Destroy previous iframe if exists
262
312
  this.iframeManager?.destroy();
@@ -265,7 +315,7 @@ class CardsAppComponent {
265
315
  this.iframeManager = new IframeManager({
266
316
  container,
267
317
  tokenData,
268
- renderingContext: { entryPoint: 'cardsApp' },
318
+ renderingContext: this.getRenderingContext(),
269
319
  theme: resolvedTheme,
270
320
  enableLogging: resolvedEnableLogging,
271
321
  logger: this.config.logger,
@@ -282,15 +332,15 @@ class CardsAppComponent {
282
332
  onTokenExpired: () => {
283
333
  this.authService.invalidateToken();
284
334
  },
335
+ ...this.getComponentCallbacks(),
285
336
  },
286
337
  });
287
338
  }
288
339
  }
289
- CardsAppComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CardsAppComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
290
- CardsAppComponentcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CardsAppComponent, isStandalone: true, selector: "capitalos-cards-app", inputs: { theme: "theme", heightOffsetPx: "heightOffsetPx", enableLogging: "enableLogging" }, outputs: { loaded: "loaded", error: "error" }, viewQueries: [{ propertyName: "iframeContainer", first: true, predicate: ["iframeContainer"], descendants: true }], ngImport: i0, template: `<div #iframeContainer class="capitalos-iframe-container"></div>`, isInline: true, styles: [":host{display:block;width:100%}.capitalos-iframe-container{width:100%}\n"] });
291
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CardsAppComponent, decorators: [{
292
- type: Component,
293
- args: [{ selector: 'capitalos-cards-app', standalone: true, template: `<div #iframeContainer class="capitalos-iframe-container"></div>`, styles: [":host{display:block;width:100%}.capitalos-iframe-container{width:100%}\n"] }]
340
+ BaseIframeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseIframeComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
341
+ BaseIframeComponentdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: BaseIframeComponent, inputs: { theme: "theme", heightOffsetPx: "heightOffsetPx", enableLogging: "enableLogging" }, outputs: { loaded: "loaded", error: "error" }, viewQueries: [{ propertyName: "iframeContainer", first: true, predicate: ["iframeContainer"], descendants: true }], ngImport: i0 });
342
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseIframeComponent, decorators: [{
343
+ type: Directive
294
344
  }], propDecorators: { theme: [{
295
345
  type: Input
296
346
  }], heightOffsetPx: [{
@@ -306,6 +356,117 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
306
356
  args: ['iframeContainer']
307
357
  }] } });
308
358
 
359
+ /**
360
+ * CardsApp component that renders the CapitalOS cards interface in an iframe.
361
+ *
362
+ * The component emits events for loading state - consumers should handle their own loading UI:
363
+ *
364
+ * ```html
365
+ * <div *ngIf="!cardsLoaded">
366
+ * <my-loading-spinner></my-loading-spinner>
367
+ * </div>
368
+ * <capitalos-cards-app
369
+ * (loaded)="cardsLoaded = true"
370
+ * (error)="onCardsError($event)"
371
+ * ></capitalos-cards-app>
372
+ * ```
373
+ */
374
+ class CardsAppComponent extends BaseIframeComponent {
375
+ getRenderingContext() {
376
+ return { entryPoint: 'cardsApp' };
377
+ }
378
+ }
379
+ CardsAppComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CardsAppComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
380
+ CardsAppComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CardsAppComponent, isStandalone: true, selector: "capitalos-cards-app", usesInheritance: true, ngImport: i0, template: "<div #iframeContainer class=\"capitalos-iframe-container\"></div>", isInline: true, styles: [":host{display:block;width:100%}.capitalos-iframe-container{width:100%}\n"] });
381
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CardsAppComponent, decorators: [{
382
+ type: Component,
383
+ args: [{ selector: 'capitalos-cards-app', standalone: true, template: IFRAME_COMPONENT_TEMPLATE, styles: [":host{display:block;width:100%}.capitalos-iframe-container{width:100%}\n"] }]
384
+ }] });
385
+
386
+ /**
387
+ * BillPayApp component that renders the CapitalOS bill payment interface in an iframe.
388
+ *
389
+ * The component emits events for loading state - consumers should handle their own loading UI:
390
+ *
391
+ * ```html
392
+ * <div *ngIf="!billPayLoaded">
393
+ * <my-loading-spinner></my-loading-spinner>
394
+ * </div>
395
+ * <capitalos-billpay-app
396
+ * (loaded)="billPayLoaded = true"
397
+ * (error)="onBillPayError($event)"
398
+ * ></capitalos-billpay-app>
399
+ * ```
400
+ */
401
+ class BillPayAppComponent extends BaseIframeComponent {
402
+ getRenderingContext() {
403
+ return { entryPoint: 'billPayApp' };
404
+ }
405
+ }
406
+ BillPayAppComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BillPayAppComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
407
+ BillPayAppComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: BillPayAppComponent, isStandalone: true, selector: "capitalos-billpay-app", usesInheritance: true, ngImport: i0, template: "<div #iframeContainer class=\"capitalos-iframe-container\"></div>", isInline: true, styles: [":host{display:block;width:100%}.capitalos-iframe-container{width:100%}\n"] });
408
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BillPayAppComponent, decorators: [{
409
+ type: Component,
410
+ args: [{ selector: 'capitalos-billpay-app', standalone: true, template: IFRAME_COMPONENT_TEMPLATE, styles: [":host{display:block;width:100%}.capitalos-iframe-container{width:100%}\n"] }]
411
+ }] });
412
+
413
+ /**
414
+ * Onboarding component that renders the CapitalOS onboarding flow in an iframe.
415
+ *
416
+ * The component emits events for loading state and completion - consumers should handle their own loading UI:
417
+ *
418
+ * ```html
419
+ * <div *ngIf="!onboardingLoaded">
420
+ * <my-loading-spinner></my-loading-spinner>
421
+ * </div>
422
+ * <capitalos-onboarding
423
+ * [entryPoint]="'welcome'"
424
+ * [exitPoint]="'activation'"
425
+ * (loaded)="onboardingLoaded = true"
426
+ * (error)="onOnboardingError($event)"
427
+ * (done)="onOnboardingComplete($event)"
428
+ * ></capitalos-onboarding>
429
+ * ```
430
+ */
431
+ class OnboardingComponent extends BaseIframeComponent {
432
+ constructor() {
433
+ super(...arguments);
434
+ // Onboarding-specific outputs
435
+ this.done = new EventEmitter();
436
+ }
437
+ getRenderingContext() {
438
+ return {
439
+ entryPoint: 'onboarding',
440
+ onboardingEntryPoint: this.entryPoint,
441
+ onboardingExitPoint: this.exitPoint,
442
+ allowExitOnNonApproved: this.allowExitOnNonApproved,
443
+ };
444
+ }
445
+ getComponentCallbacks() {
446
+ return {
447
+ onboarding: {
448
+ onDone: (account) => {
449
+ this.done.emit(account);
450
+ },
451
+ },
452
+ };
453
+ }
454
+ }
455
+ OnboardingComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OnboardingComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
456
+ OnboardingComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: OnboardingComponent, isStandalone: true, selector: "capitalos-onboarding", inputs: { entryPoint: "entryPoint", exitPoint: "exitPoint", allowExitOnNonApproved: "allowExitOnNonApproved" }, outputs: { done: "done" }, usesInheritance: true, ngImport: i0, template: "<div #iframeContainer class=\"capitalos-iframe-container\"></div>", isInline: true, styles: [":host{display:block;width:100%}.capitalos-iframe-container{width:100%}\n"] });
457
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OnboardingComponent, decorators: [{
458
+ type: Component,
459
+ args: [{ selector: 'capitalos-onboarding', standalone: true, template: IFRAME_COMPONENT_TEMPLATE, styles: [":host{display:block;width:100%}.capitalos-iframe-container{width:100%}\n"] }]
460
+ }], propDecorators: { entryPoint: [{
461
+ type: Input
462
+ }], exitPoint: [{
463
+ type: Input
464
+ }], allowExitOnNonApproved: [{
465
+ type: Input
466
+ }], done: [{
467
+ type: Output
468
+ }] } });
469
+
309
470
  /**
310
471
  * NgModule for CapitalOS SDK.
311
472
  *
@@ -338,13 +499,13 @@ class CapitalOsModule {
338
499
  }
339
500
  }
340
501
  CapitalOsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CapitalOsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
341
- CapitalOsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: CapitalOsModule, imports: [CardsAppComponent], exports: [CardsAppComponent] });
342
- CapitalOsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CapitalOsModule, imports: [CardsAppComponent] });
502
+ CapitalOsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: CapitalOsModule, imports: [CardsAppComponent, BillPayAppComponent, OnboardingComponent], exports: [CardsAppComponent, BillPayAppComponent, OnboardingComponent] });
503
+ CapitalOsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CapitalOsModule, imports: [CardsAppComponent, BillPayAppComponent, OnboardingComponent] });
343
504
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CapitalOsModule, decorators: [{
344
505
  type: NgModule,
345
506
  args: [{
346
- imports: [CardsAppComponent],
347
- exports: [CardsAppComponent],
507
+ imports: [CardsAppComponent, BillPayAppComponent, OnboardingComponent],
508
+ exports: [CardsAppComponent, BillPayAppComponent, OnboardingComponent],
348
509
  }]
349
510
  }] });
350
511
 
@@ -356,5 +517,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
356
517
  * Generated bundle index. Do not edit.
357
518
  */
358
519
 
359
- export { CAPITALOS_CONFIG, CapitalOsAuthService, CapitalOsModule, CardsAppComponent, provideCapitalOs };
520
+ export { BillPayAppComponent, CAPITALOS_CONFIG, CapitalOsAuthService, CapitalOsModule, CardsAppComponent, OnboardingComponent, provideCapitalOs };
360
521
  //# sourceMappingURL=capitalos-angular.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"capitalos-angular.mjs","sources":["../../../projects/capitalos-angular/src/lib/provide-capitalos.ts","../../../projects/capitalos-angular/src/lib/token-exchange.service.ts","../../../projects/capitalos-angular/src/lib/capitalos-auth.service.ts","../../../projects/capitalos-angular/src/lib/cards-app.component.ts","../../../projects/capitalos-angular/src/lib/capitalos.module.ts","../../../projects/capitalos-angular/src/public-api.ts","../../../projects/capitalos-angular/src/capitalos-angular.ts"],"sourcesContent":["import { InjectionToken, Provider } from '@angular/core'\nimport { Logger, ThemeColorScheme } from '@capitalos/core'\nimport { CapitalOsAuthService } from './capitalos-auth.service'\nimport { TokenExchangeService } from './token-exchange.service'\n\n/**\n * Configuration for CapitalOS SDK\n */\nexport interface CapitalOsConfig {\n /**\n * Function that returns a promise resolving to a one-time token.\n * This is typically a call to your backend that initiates a CapitalOS login.\n */\n getToken: () => Promise<string>\n\n /**\n * Whether to enable logging for debugging purposes.\n */\n enableLogging?: boolean\n\n /**\n * Optional custom logger for capturing SDK logs.\n */\n logger?: Logger\n\n /**\n * Theme color scheme for the SDK components.\n */\n theme?: ThemeColorScheme\n}\n\n/**\n * Injection token for CapitalOS configuration\n */\nexport const CAPITALOS_CONFIG = new InjectionToken<CapitalOsConfig>('CAPITALOS_CONFIG')\n\n/**\n * Provides the CapitalOS SDK with the specified configuration.\n *\n * Usage in app.config.ts (standalone):\n * ```typescript\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideCapitalOs({\n * getToken: async () => {\n * const response = await fetch('/api/capitalos/token');\n * const data = await response.json();\n * return data.token;\n * },\n * enableLogging: true,\n * }),\n * ],\n * });\n * ```\n *\n * For NgModule-based apps, use CapitalOsModule.forRoot() instead.\n */\nexport function provideCapitalOs(config: CapitalOsConfig): Provider[] {\n return [\n {\n provide: CAPITALOS_CONFIG,\n useValue: config,\n },\n TokenExchangeService,\n CapitalOsAuthService,\n ]\n}\n","import { Injectable, inject, OnDestroy } from '@angular/core'\nimport { exchangeOneTimeToken } from '@capitalos/core'\nimport { CAPITALOS_CONFIG } from './provide-capitalos'\n\nconst TOKEN_EXCHANGE_TIMEOUT_MS = 10_000\n\nexport interface TokenExchangeResult {\n longLivedToken: string\n baseUrl: string\n}\n\n/**\n * Service responsible for exchanging one-time tokens for long-lived JWTs.\n * Creates a hidden iframe to perform the token exchange securely.\n */\n@Injectable()\nexport class TokenExchangeService implements OnDestroy {\n private readonly config = inject(CAPITALOS_CONFIG)\n private isDestroyed = false\n private activeAbortController: AbortController | null = null\n\n ngOnDestroy(): void {\n this.isDestroyed = true\n this.activeAbortController?.abort()\n this.activeAbortController = null\n }\n\n /**\n * Exchanges a one-time token for a long-lived JWT.\n * Delegates to @capitalos/core (browser-only) which handles iframe + Penpal lifecycle.\n */\n async exchange(oneTimeToken: string, options: { enableLogging?: boolean } = {}): Promise<TokenExchangeResult> {\n if (this.isDestroyed) {\n throw new Error('TokenExchangeService was destroyed')\n }\n\n // Abort any in-flight exchange when a new one begins.\n this.activeAbortController?.abort()\n\n const abortController = new AbortController()\n this.activeAbortController = abortController\n\n try {\n return await exchangeOneTimeToken({\n oneTimeToken,\n enableLogging: options.enableLogging,\n logger: this.config.logger,\n timeoutMs: TOKEN_EXCHANGE_TIMEOUT_MS,\n signal: abortController.signal,\n })\n } finally {\n if (this.activeAbortController === abortController) {\n this.activeAbortController = null\n }\n }\n }\n}\n","import { Injectable, inject, OnDestroy } from '@angular/core'\nimport { BehaviorSubject, Observable, combineLatest, map } from 'rxjs'\nimport { TokenData, TokenType, TokenParamKey, TokenParamLocation, createLogger } from '@capitalos/core'\nimport { TokenExchangeService } from './token-exchange.service'\nimport { CAPITALOS_CONFIG } from './provide-capitalos'\n\n/**\n * Converts an unknown error to an Error object\n */\nfunction toError(error: unknown): Error {\n if (error instanceof Error) {\n return error\n }\n return new Error(String(error))\n}\n\n/**\n * Authentication state enum\n */\nexport type AuthState = 'idle' | 'loading' | 'authenticated' | 'error'\n\n/**\n * Service that manages CapitalOS authentication state.\n * This is the Angular equivalent of React's CapitalOsAuthenticationProvider.\n *\n * It handles:\n * - Fetching one-time tokens via the provided getToken callback\n * - Exchanging one-time tokens for long-lived JWTs\n * - Managing token state via observables\n * - Auto-refreshing tokens when they expire\n */\n@Injectable()\nexport class CapitalOsAuthService implements OnDestroy {\n private readonly config = inject(CAPITALOS_CONFIG)\n private readonly tokenExchangeService = inject(TokenExchangeService)\n\n // Private BehaviorSubjects for internal state\n private readonly _longLivedToken$ = new BehaviorSubject<string | undefined>(undefined)\n private readonly _baseUrl$ = new BehaviorSubject<string | undefined>(undefined)\n private readonly _isLoading$ = new BehaviorSubject(false)\n private readonly _error$ = new BehaviorSubject<Error | undefined>(undefined)\n\n // Public observable for token data\n readonly tokenData$: Observable<TokenData | undefined> = combineLatest([this._longLivedToken$, this._baseUrl$]).pipe(\n map(([token, baseUrl]) => {\n if (!token || !baseUrl) {\n return undefined\n }\n\n return {\n token,\n tokenType: TokenType.longLived,\n baseUrl,\n paramKey: TokenParamKey.accessToken,\n paramLocation: TokenParamLocation.hash,\n }\n })\n )\n\n // Public observables for UI state\n readonly isLoading$: Observable<boolean> = this._isLoading$.asObservable()\n readonly error$: Observable<Error | undefined> = this._error$.asObservable()\n readonly authState$: Observable<AuthState> = combineLatest([this._isLoading$, this._error$, this.tokenData$]).pipe(\n map(([isLoading, error, tokenData]) => {\n if (isLoading) return 'loading'\n if (error) return 'error'\n if (tokenData) return 'authenticated'\n return 'idle'\n })\n )\n\n private isDestroyed = false\n private logger: ReturnType<typeof createLogger>\n\n constructor() {\n this.logger = createLogger(this.config.enableLogging, this.config.logger)\n\n // Start authentication flow eagerly on construction.\n // This is intentional: auth begins as soon as the app boots so the token\n // is ready when CardsAppComponent renders, reducing perceived load time.\n this.refreshToken()\n }\n\n ngOnDestroy(): void {\n this.isDestroyed = true\n }\n\n /**\n * Invalidates the current token, triggering a refresh.\n * Called when the iframe signals that the token has expired.\n */\n invalidateToken(): void {\n this.logger.log('CapitalOsAuthService: Invalidating token')\n this._longLivedToken$.next(undefined)\n this._baseUrl$.next(undefined)\n this._error$.next(undefined)\n this.refreshToken()\n }\n\n /**\n * Refreshes the token by fetching a new one-time token and exchanging it.\n */\n async refreshToken(): Promise<void> {\n if (this.isDestroyed) {\n return\n }\n\n // Prevent concurrent refresh calls - if already loading, skip\n if (this._isLoading$.value) {\n this.logger.log('CapitalOsAuthService: Token refresh already in progress, skipping')\n return\n }\n\n this.logger.log('CapitalOsAuthService: Starting token refresh')\n this._isLoading$.next(true)\n this._error$.next(undefined)\n\n try {\n // Get one-time token from platform\n const oneTimeToken = await this.config.getToken()\n this.logger.log('CapitalOsAuthService: Received one-time token')\n\n if (this.isDestroyed) {\n return\n }\n\n // Exchange for long-lived token\n const result = await this.tokenExchangeService.exchange(oneTimeToken, {\n enableLogging: this.config.enableLogging,\n })\n\n if (this.isDestroyed) {\n return\n }\n\n this._longLivedToken$.next(result.longLivedToken)\n this._baseUrl$.next(result.baseUrl)\n this._error$.next(undefined)\n this.logger.log('CapitalOsAuthService: Token exchange complete')\n } catch (rawError) {\n if (!this.isDestroyed) {\n const error = toError(rawError)\n this.logger.error(`CapitalOsAuthService: Token refresh failed: ${error.message}`)\n this._error$.next(error)\n }\n } finally {\n if (!this.isDestroyed) {\n this._isLoading$.next(false)\n }\n }\n }\n}\n","import {\n Component,\n inject,\n Input,\n Output,\n EventEmitter,\n ViewChild,\n ElementRef,\n AfterViewInit,\n OnDestroy,\n} from '@angular/core'\nimport { Subscription } from 'rxjs'\nimport { IframeManager, CapitalOSError, TokenData, RawErrorDetails, ThemeColorScheme } from '@capitalos/core'\nimport { CapitalOsAuthService } from './capitalos-auth.service'\nimport { CAPITALOS_CONFIG } from './provide-capitalos'\n\n// TODO: Automate version injection at build time\nconst SDK_VERSION = '0.1.0-rc.1'\n\n/**\n * CardsApp component that renders the CapitalOS cards interface in an iframe.\n *\n * The component emits events for loading state - consumers should handle their own loading UI:\n *\n * ```html\n * <div *ngIf=\"!cardsLoaded\">\n * <my-loading-spinner></my-loading-spinner>\n * </div>\n * <capitalos-cards-app\n * (loaded)=\"cardsLoaded = true\"\n * (error)=\"onCardsError($event)\"\n * ></capitalos-cards-app>\n * ```\n */\n@Component({\n selector: 'capitalos-cards-app',\n standalone: true,\n template: `<div #iframeContainer class=\"capitalos-iframe-container\"></div>`,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n .capitalos-iframe-container {\n width: 100%;\n }\n `,\n ],\n})\nexport class CardsAppComponent implements AfterViewInit, OnDestroy {\n // Injected services\n private readonly authService = inject(CapitalOsAuthService)\n private readonly config = inject(CAPITALOS_CONFIG)\n\n // Inputs\n @Input() theme?: ThemeColorScheme\n @Input() heightOffsetPx = 12\n @Input() enableLogging?: boolean\n\n // Outputs\n @Output() loaded = new EventEmitter<void>()\n @Output() error = new EventEmitter<CapitalOSError>()\n\n // View children\n @ViewChild('iframeContainer') iframeContainer?: ElementRef<HTMLDivElement>\n\n // Internal state\n private iframeManager?: IframeManager\n private tokenDataSubscription?: Subscription\n\n ngAfterViewInit(): void {\n // Subscribe to tokenData$ and initialize iframe when ready\n this.tokenDataSubscription = this.authService.tokenData$.subscribe((tokenData) => {\n if (tokenData && this.iframeContainer) {\n this.initializeIframe(tokenData, this.iframeContainer.nativeElement)\n }\n })\n }\n\n ngOnDestroy(): void {\n this.tokenDataSubscription?.unsubscribe()\n this.iframeManager?.destroy()\n }\n\n private initializeIframe(tokenData: TokenData, container: HTMLElement): void {\n // Destroy previous iframe if exists\n this.iframeManager?.destroy()\n\n const resolvedEnableLogging = this.enableLogging ?? this.config.enableLogging ?? false\n const resolvedTheme = this.theme ?? this.config.theme\n\n this.iframeManager = new IframeManager({\n container,\n tokenData,\n renderingContext: { entryPoint: 'cardsApp' },\n theme: resolvedTheme,\n enableLogging: resolvedEnableLogging,\n logger: this.config.logger,\n sdkVersion: SDK_VERSION,\n heightOffsetPx: this.heightOffsetPx,\n callbacks: {\n onLoad: () => {\n this.loaded.emit()\n },\n onError: (rawError: RawErrorDetails) => {\n const capitalOsError = new CapitalOSError(rawError)\n this.error.emit(capitalOsError)\n },\n onTokenExpired: () => {\n this.authService.invalidateToken()\n },\n },\n })\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core'\nimport { CardsAppComponent } from './cards-app.component'\nimport { CapitalOsConfig, CAPITALOS_CONFIG } from './provide-capitalos'\nimport { CapitalOsAuthService } from './capitalos-auth.service'\nimport { TokenExchangeService } from './token-exchange.service'\n\n/**\n * NgModule for CapitalOS SDK.\n *\n * Use this module for NgModule-based Angular applications.\n * For standalone applications, use provideCapitalOs() instead.\n *\n * Usage:\n * ```typescript\n * @NgModule({\n * imports: [\n * CapitalOsModule.forRoot({\n * getToken: async () => {\n * const response = await fetch('/api/capitalos/token');\n * const data = await response.json();\n * return data.token;\n * },\n * enableLogging: true,\n * }),\n * ],\n * })\n * export class AppModule {}\n * ```\n */\n@NgModule({\n imports: [CardsAppComponent],\n exports: [CardsAppComponent],\n})\nexport class CapitalOsModule {\n static forRoot(config: CapitalOsConfig): ModuleWithProviders<CapitalOsModule> {\n return {\n ngModule: CapitalOsModule,\n providers: [{ provide: CAPITALOS_CONFIG, useValue: config }, TokenExchangeService, CapitalOsAuthService],\n }\n }\n}\n","/*\n * Public API Surface of @capitalos/angular\n */\n\n// Components\nexport { CardsAppComponent } from './lib/cards-app.component'\n\n// Services\nexport { CapitalOsAuthService } from './lib/capitalos-auth.service'\nexport type { AuthState } from './lib/capitalos-auth.service'\n\n// Provider (standalone)\nexport { provideCapitalOs, CAPITALOS_CONFIG } from './lib/provide-capitalos'\nexport type { CapitalOsConfig } from './lib/provide-capitalos'\n\n// Module (NgModule-based apps)\nexport { CapitalOsModule } from './lib/capitalos.module'\n\n// Re-export commonly used types from core\nexport type { ThemeColorScheme, Logger, TokenData, RawErrorDetails } from '@capitalos/core'\n\nexport { CapitalOSError, ErrorCode } from '@capitalos/core'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capitalos-angular.mjs","sources":["../../../projects/capitalos-angular/src/lib/provide-capitalos.ts","../../../projects/capitalos-angular/src/lib/token-exchange.service.ts","../../../projects/capitalos-angular/src/lib/capitalos-auth.service.ts","../../../projects/capitalos-angular/src/lib/version.ts","../../../projects/capitalos-angular/src/lib/base-iframe.component.ts","../../../projects/capitalos-angular/src/lib/cards-app.component.ts","../../../projects/capitalos-angular/src/lib/billpay-app.component.ts","../../../projects/capitalos-angular/src/lib/onboarding.component.ts","../../../projects/capitalos-angular/src/lib/capitalos.module.ts","../../../projects/capitalos-angular/src/public-api.ts","../../../projects/capitalos-angular/src/capitalos-angular.ts"],"sourcesContent":["import { InjectionToken, Provider } from '@angular/core'\nimport { Logger, ThemeColorScheme } from '@capitalos/core'\nimport { CapitalOsAuthService } from './capitalos-auth.service'\nimport { TokenExchangeService } from './token-exchange.service'\n\n/**\n * Configuration for CapitalOS SDK\n */\nexport interface CapitalOsConfig {\n /**\n * Function that returns a promise resolving to a one-time token.\n * This is typically a call to your backend that initiates a CapitalOS login.\n */\n getToken: () => Promise<string>\n\n /**\n * Whether to enable logging for debugging purposes.\n */\n enableLogging?: boolean\n\n /**\n * Optional custom logger for capturing SDK logs.\n */\n logger?: Logger\n\n /**\n * Theme color scheme for the SDK components.\n */\n theme?: ThemeColorScheme\n}\n\n/**\n * Injection token for CapitalOS configuration\n */\nexport const CAPITALOS_CONFIG = new InjectionToken<CapitalOsConfig>('CAPITALOS_CONFIG')\n\n/**\n * Provides the CapitalOS SDK with the specified configuration.\n *\n * Usage in app.config.ts (standalone):\n * ```typescript\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideCapitalOs({\n * getToken: async () => {\n * const response = await fetch('/api/capitalos/token');\n * const data = await response.json();\n * return data.token;\n * },\n * enableLogging: true,\n * }),\n * ],\n * });\n * ```\n *\n * For NgModule-based apps, use CapitalOsModule.forRoot() instead.\n */\nexport function provideCapitalOs(config: CapitalOsConfig): Provider[] {\n return [\n {\n provide: CAPITALOS_CONFIG,\n useValue: config,\n },\n TokenExchangeService,\n CapitalOsAuthService,\n ]\n}\n","import { Injectable, inject, OnDestroy } from '@angular/core'\nimport { exchangeOneTimeToken } from '@capitalos/core'\nimport { CAPITALOS_CONFIG } from './provide-capitalos'\n\nconst TOKEN_EXCHANGE_TIMEOUT_MS = 10_000\n\nexport interface TokenExchangeResult {\n longLivedToken: string\n baseUrl: string\n}\n\n/**\n * Service responsible for exchanging one-time tokens for long-lived JWTs.\n * Creates a hidden iframe to perform the token exchange securely.\n */\n@Injectable()\nexport class TokenExchangeService implements OnDestroy {\n private readonly config = inject(CAPITALOS_CONFIG)\n private isDestroyed = false\n private activeAbortController: AbortController | null = null\n\n ngOnDestroy(): void {\n this.isDestroyed = true\n this.activeAbortController?.abort()\n this.activeAbortController = null\n }\n\n /**\n * Exchanges a one-time token for a long-lived JWT.\n * Delegates to @capitalos/core (browser-only) which handles iframe + Penpal lifecycle.\n */\n async exchange(oneTimeToken: string, options: { enableLogging?: boolean } = {}): Promise<TokenExchangeResult> {\n if (this.isDestroyed) {\n throw new Error('TokenExchangeService was destroyed')\n }\n\n // Abort any in-flight exchange when a new one begins.\n this.activeAbortController?.abort()\n\n const abortController = new AbortController()\n this.activeAbortController = abortController\n\n try {\n return await exchangeOneTimeToken({\n oneTimeToken,\n enableLogging: options.enableLogging,\n logger: this.config.logger,\n timeoutMs: TOKEN_EXCHANGE_TIMEOUT_MS,\n signal: abortController.signal,\n })\n } finally {\n if (this.activeAbortController === abortController) {\n this.activeAbortController = null\n }\n }\n }\n}\n","import { Injectable, inject, OnDestroy } from '@angular/core'\nimport { BehaviorSubject, Observable, combineLatest, map } from 'rxjs'\nimport { TokenData, TokenType, TokenParamKey, TokenParamLocation, createLogger } from '@capitalos/core'\nimport { TokenExchangeService } from './token-exchange.service'\nimport { CAPITALOS_CONFIG } from './provide-capitalos'\n\n/**\n * Converts an unknown error to an Error object\n */\nfunction toError(error: unknown): Error {\n if (error instanceof Error) {\n return error\n }\n return new Error(String(error))\n}\n\n/**\n * Authentication state enum\n */\nexport type AuthState = 'idle' | 'loading' | 'authenticated' | 'error'\n\n/**\n * Service that manages CapitalOS authentication state.\n * This is the Angular equivalent of React's CapitalOsAuthenticationProvider.\n *\n * It handles:\n * - Fetching one-time tokens via the provided getToken callback\n * - Exchanging one-time tokens for long-lived JWTs\n * - Managing token state via observables\n * - Auto-refreshing tokens when they expire\n */\n@Injectable()\nexport class CapitalOsAuthService implements OnDestroy {\n private readonly config = inject(CAPITALOS_CONFIG)\n private readonly tokenExchangeService = inject(TokenExchangeService)\n\n // Private BehaviorSubjects for internal state\n private readonly _longLivedToken$ = new BehaviorSubject<string | undefined>(undefined)\n private readonly _baseUrl$ = new BehaviorSubject<string | undefined>(undefined)\n private readonly _isLoading$ = new BehaviorSubject(false)\n private readonly _error$ = new BehaviorSubject<Error | undefined>(undefined)\n\n // Public observable for token data\n readonly tokenData$: Observable<TokenData | undefined> = combineLatest([this._longLivedToken$, this._baseUrl$]).pipe(\n map(([token, baseUrl]) => {\n if (!token || !baseUrl) {\n return undefined\n }\n\n return {\n token,\n tokenType: TokenType.longLived,\n baseUrl,\n paramKey: TokenParamKey.accessToken,\n paramLocation: TokenParamLocation.hash,\n }\n })\n )\n\n // Public observables for UI state\n readonly isLoading$: Observable<boolean> = this._isLoading$.asObservable()\n readonly error$: Observable<Error | undefined> = this._error$.asObservable()\n readonly authState$: Observable<AuthState> = combineLatest([this._isLoading$, this._error$, this.tokenData$]).pipe(\n map(([isLoading, error, tokenData]) => {\n if (isLoading) return 'loading'\n if (error) return 'error'\n if (tokenData) return 'authenticated'\n return 'idle'\n })\n )\n\n private isDestroyed = false\n private logger: ReturnType<typeof createLogger>\n\n constructor() {\n this.logger = createLogger(this.config.enableLogging, this.config.logger)\n\n // Start authentication flow eagerly on construction.\n // This is intentional: auth begins as soon as the app boots so the token\n // is ready when CardsAppComponent renders, reducing perceived load time.\n this.refreshToken()\n }\n\n ngOnDestroy(): void {\n this.isDestroyed = true\n }\n\n /**\n * Invalidates the current token, triggering a refresh.\n * Called when the iframe signals that the token has expired.\n */\n invalidateToken(): void {\n this.logger.log('CapitalOsAuthService: Invalidating token')\n this._longLivedToken$.next(undefined)\n this._baseUrl$.next(undefined)\n this._error$.next(undefined)\n this.refreshToken()\n }\n\n /**\n * Refreshes the token by fetching a new one-time token and exchanging it.\n */\n async refreshToken(): Promise<void> {\n if (this.isDestroyed) {\n return\n }\n\n // Prevent concurrent refresh calls - if already loading, skip\n if (this._isLoading$.value) {\n this.logger.log('CapitalOsAuthService: Token refresh already in progress, skipping')\n return\n }\n\n this.logger.log('CapitalOsAuthService: Starting token refresh')\n this._isLoading$.next(true)\n this._error$.next(undefined)\n\n try {\n // Get one-time token from platform\n const oneTimeToken = await this.config.getToken()\n this.logger.log('CapitalOsAuthService: Received one-time token')\n\n if (this.isDestroyed) {\n return\n }\n\n // Exchange for long-lived token\n const result = await this.tokenExchangeService.exchange(oneTimeToken, {\n enableLogging: this.config.enableLogging,\n })\n\n if (this.isDestroyed) {\n return\n }\n\n this._longLivedToken$.next(result.longLivedToken)\n this._baseUrl$.next(result.baseUrl)\n this._error$.next(undefined)\n this.logger.log('CapitalOsAuthService: Token exchange complete')\n } catch (rawError) {\n if (!this.isDestroyed) {\n const error = toError(rawError)\n this.logger.error(`CapitalOsAuthService: Token refresh failed: ${error.message}`)\n this._error$.next(error)\n }\n } finally {\n if (!this.isDestroyed) {\n this._isLoading$.next(false)\n }\n }\n }\n}\n","// AUTO-GENERATED FILE - DO NOT EDIT\n// Generated by: scripts/generate-version.js\n// Source: projects/capitalos-angular/package.json\n\nexport const SDK_VERSION = '0.1.1'\n","import {\n inject,\n Input,\n Output,\n EventEmitter,\n ViewChild,\n ElementRef,\n AfterViewInit,\n OnDestroy,\n Directive,\n} from '@angular/core'\nimport { Subscription } from 'rxjs'\nimport {\n IframeManager,\n CapitalOSError,\n TokenData,\n RawErrorDetails,\n ThemeColorScheme,\n RenderingContext,\n IframeManagerConfig,\n} from '@capitalos/core'\nimport { CapitalOsAuthService } from './capitalos-auth.service'\nimport { CAPITALOS_CONFIG } from './provide-capitalos'\nimport { SDK_VERSION } from './version'\n\n/**\n * Common template for all iframe components.\n * Angular doesn't support inheriting templates, so subclasses must use this constant.\n */\nexport const IFRAME_COMPONENT_TEMPLATE = `<div #iframeContainer class=\"capitalos-iframe-container\"></div>`\n\n/**\n * Common styles for all iframe components.\n * Angular doesn't support inheriting styles, so subclasses must use this constant.\n *\n * Why Angular needs these styles (unlike React/Vue):\n * Angular component selectors (e.g., <capitalos-cards-app>) remain in the DOM as real elements.\n * Without :host styling, the component element may collapse or not fill its container.\n * In React/Vue, component tags are replaced by rendered content, so no wrapper styling is needed.\n */\nexport const IFRAME_COMPONENT_STYLES = [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n .capitalos-iframe-container {\n width: 100%;\n }\n `,\n]\n\n/**\n * Component-specific callbacks to pass to IframeManager.\n * Excludes common callbacks (onLoad, onError, onTokenExpired) which the base class handles.\n */\nexport type ComponentCallbacks = Omit<IframeManagerConfig['callbacks'], 'onLoad' | 'onError' | 'onTokenExpired'>\n\n/**\n * Abstract base class for CapitalOS iframe components.\n *\n * Handles common functionality:\n * - Token subscription and iframe initialization\n * - Common inputs (theme, heightOffsetPx, enableLogging)\n * - Common outputs (loaded, error)\n * - Lifecycle management (cleanup on destroy)\n *\n * Subclasses must implement:\n * - `getRenderingContext()` - returns the component-specific rendering context\n *\n * Subclasses may override:\n * - `getComponentCallbacks()` - returns component-specific Penpal callbacks\n *\n * Note: Rendering context inputs (e.g., entryPoint, exitPoint for Onboarding) are read once\n * at iframe initialization. Changes to these inputs after the iframe loads will NOT trigger\n * re-initialization. This matches the behavior of the React SDK.\n *\n * @example\n * ```typescript\n * @Component({ selector: 'my-component', ... })\n * export class MyComponent extends BaseIframeComponent {\n * protected getRenderingContext(): RenderingContext {\n * return { entryPoint: 'myComponent' }\n * }\n * }\n * ```\n */\n@Directive()\nexport abstract class BaseIframeComponent implements AfterViewInit, OnDestroy {\n // Injected services\n protected readonly authService = inject(CapitalOsAuthService)\n protected readonly config = inject(CAPITALOS_CONFIG)\n\n // Common inputs\n @Input() theme?: ThemeColorScheme\n @Input() heightOffsetPx = 12\n @Input() enableLogging?: boolean\n\n // Common outputs\n @Output() loaded = new EventEmitter<void>()\n @Output() error = new EventEmitter<CapitalOSError>()\n\n // View children\n @ViewChild('iframeContainer') iframeContainer?: ElementRef<HTMLDivElement>\n\n // Internal state\n private iframeManager?: IframeManager\n private tokenDataSubscription?: Subscription\n\n ngAfterViewInit(): void {\n // Subscribe to tokenData$ and initialize iframe when ready\n this.tokenDataSubscription = this.authService.tokenData$.subscribe((tokenData) => {\n if (tokenData && this.iframeContainer) {\n this.initializeIframe(tokenData, this.iframeContainer.nativeElement)\n }\n })\n }\n\n ngOnDestroy(): void {\n this.tokenDataSubscription?.unsubscribe()\n this.iframeManager?.destroy()\n }\n\n /**\n * Returns the rendering context for this component.\n * Must be implemented by subclasses.\n */\n protected abstract getRenderingContext(): RenderingContext\n\n /**\n * Returns component-specific Penpal callbacks.\n * Override in subclasses that need callbacks (e.g., Onboarding, TokenExchange).\n */\n protected getComponentCallbacks(): ComponentCallbacks {\n return {}\n }\n\n private initializeIframe(tokenData: TokenData, container: HTMLElement): void {\n // Destroy previous iframe if exists\n this.iframeManager?.destroy()\n\n const resolvedEnableLogging = this.enableLogging ?? this.config.enableLogging ?? false\n const resolvedTheme = this.theme ?? this.config.theme\n\n this.iframeManager = new IframeManager({\n container,\n tokenData,\n renderingContext: this.getRenderingContext(),\n theme: resolvedTheme,\n enableLogging: resolvedEnableLogging,\n logger: this.config.logger,\n sdkVersion: SDK_VERSION,\n heightOffsetPx: this.heightOffsetPx,\n callbacks: {\n onLoad: () => {\n this.loaded.emit()\n },\n onError: (rawError: RawErrorDetails) => {\n const capitalOsError = new CapitalOSError(rawError)\n this.error.emit(capitalOsError)\n },\n onTokenExpired: () => {\n this.authService.invalidateToken()\n },\n ...this.getComponentCallbacks(),\n },\n })\n }\n}\n","import { Component } from '@angular/core'\nimport { RenderingContext } from '@capitalos/core'\nimport { BaseIframeComponent, IFRAME_COMPONENT_TEMPLATE, IFRAME_COMPONENT_STYLES } from './base-iframe.component'\n\n/**\n * CardsApp component that renders the CapitalOS cards interface in an iframe.\n *\n * The component emits events for loading state - consumers should handle their own loading UI:\n *\n * ```html\n * <div *ngIf=\"!cardsLoaded\">\n * <my-loading-spinner></my-loading-spinner>\n * </div>\n * <capitalos-cards-app\n * (loaded)=\"cardsLoaded = true\"\n * (error)=\"onCardsError($event)\"\n * ></capitalos-cards-app>\n * ```\n */\n@Component({\n selector: 'capitalos-cards-app',\n standalone: true,\n template: IFRAME_COMPONENT_TEMPLATE,\n styles: IFRAME_COMPONENT_STYLES,\n})\nexport class CardsAppComponent extends BaseIframeComponent {\n protected getRenderingContext(): RenderingContext {\n return { entryPoint: 'cardsApp' }\n }\n}\n","import { Component } from '@angular/core'\nimport { RenderingContext } from '@capitalos/core'\nimport { BaseIframeComponent, IFRAME_COMPONENT_TEMPLATE, IFRAME_COMPONENT_STYLES } from './base-iframe.component'\n\n/**\n * BillPayApp component that renders the CapitalOS bill payment interface in an iframe.\n *\n * The component emits events for loading state - consumers should handle their own loading UI:\n *\n * ```html\n * <div *ngIf=\"!billPayLoaded\">\n * <my-loading-spinner></my-loading-spinner>\n * </div>\n * <capitalos-billpay-app\n * (loaded)=\"billPayLoaded = true\"\n * (error)=\"onBillPayError($event)\"\n * ></capitalos-billpay-app>\n * ```\n */\n@Component({\n selector: 'capitalos-billpay-app',\n standalone: true,\n template: IFRAME_COMPONENT_TEMPLATE,\n styles: IFRAME_COMPONENT_STYLES,\n})\nexport class BillPayAppComponent extends BaseIframeComponent {\n protected getRenderingContext(): RenderingContext {\n return { entryPoint: 'billPayApp' }\n }\n}\n","import { Component, Input, Output, EventEmitter } from '@angular/core'\nimport { RenderingContext, Account, OnboardingEntryPoint, OnboardingExitPoint } from '@capitalos/core'\nimport {\n BaseIframeComponent,\n ComponentCallbacks,\n IFRAME_COMPONENT_TEMPLATE,\n IFRAME_COMPONENT_STYLES,\n} from './base-iframe.component'\n\n/**\n * Onboarding component that renders the CapitalOS onboarding flow in an iframe.\n *\n * The component emits events for loading state and completion - consumers should handle their own loading UI:\n *\n * ```html\n * <div *ngIf=\"!onboardingLoaded\">\n * <my-loading-spinner></my-loading-spinner>\n * </div>\n * <capitalos-onboarding\n * [entryPoint]=\"'welcome'\"\n * [exitPoint]=\"'activation'\"\n * (loaded)=\"onboardingLoaded = true\"\n * (error)=\"onOnboardingError($event)\"\n * (done)=\"onOnboardingComplete($event)\"\n * ></capitalos-onboarding>\n * ```\n */\n@Component({\n selector: 'capitalos-onboarding',\n standalone: true,\n template: IFRAME_COMPONENT_TEMPLATE,\n styles: IFRAME_COMPONENT_STYLES,\n})\nexport class OnboardingComponent extends BaseIframeComponent {\n // Onboarding-specific inputs\n @Input() entryPoint?: OnboardingEntryPoint\n @Input() exitPoint?: OnboardingExitPoint\n @Input() allowExitOnNonApproved?: boolean\n\n // Onboarding-specific outputs\n @Output() done = new EventEmitter<Account>()\n\n protected getRenderingContext(): RenderingContext {\n return {\n entryPoint: 'onboarding',\n onboardingEntryPoint: this.entryPoint,\n onboardingExitPoint: this.exitPoint,\n allowExitOnNonApproved: this.allowExitOnNonApproved,\n }\n }\n\n protected override getComponentCallbacks(): ComponentCallbacks {\n return {\n onboarding: {\n onDone: (account: Account) => {\n this.done.emit(account)\n },\n },\n }\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core'\nimport { CardsAppComponent } from './cards-app.component'\nimport { BillPayAppComponent } from './billpay-app.component'\nimport { OnboardingComponent } from './onboarding.component'\nimport { CapitalOsConfig, CAPITALOS_CONFIG } from './provide-capitalos'\nimport { CapitalOsAuthService } from './capitalos-auth.service'\nimport { TokenExchangeService } from './token-exchange.service'\n\n/**\n * NgModule for CapitalOS SDK.\n *\n * Use this module for NgModule-based Angular applications.\n * For standalone applications, use provideCapitalOs() instead.\n *\n * Usage:\n * ```typescript\n * @NgModule({\n * imports: [\n * CapitalOsModule.forRoot({\n * getToken: async () => {\n * const response = await fetch('/api/capitalos/token');\n * const data = await response.json();\n * return data.token;\n * },\n * enableLogging: true,\n * }),\n * ],\n * })\n * export class AppModule {}\n * ```\n */\n@NgModule({\n imports: [CardsAppComponent, BillPayAppComponent, OnboardingComponent],\n exports: [CardsAppComponent, BillPayAppComponent, OnboardingComponent],\n})\nexport class CapitalOsModule {\n static forRoot(config: CapitalOsConfig): ModuleWithProviders<CapitalOsModule> {\n return {\n ngModule: CapitalOsModule,\n providers: [{ provide: CAPITALOS_CONFIG, useValue: config }, TokenExchangeService, CapitalOsAuthService],\n }\n }\n}\n","/*\n * Public API Surface of @capitalos/angular\n */\n\n// Components\nexport { CardsAppComponent } from './lib/cards-app.component'\nexport { BillPayAppComponent } from './lib/billpay-app.component'\nexport { OnboardingComponent } from './lib/onboarding.component'\n\n// Services\nexport { CapitalOsAuthService } from './lib/capitalos-auth.service'\nexport type { AuthState } from './lib/capitalos-auth.service'\n\n// Provider (standalone)\nexport { provideCapitalOs, CAPITALOS_CONFIG } from './lib/provide-capitalos'\nexport type { CapitalOsConfig } from './lib/provide-capitalos'\n\n// Module (NgModule-based apps)\nexport { CapitalOsModule } from './lib/capitalos.module'\n\n// Re-export commonly used types from core\nexport type { ThemeColorScheme, Logger, TokenData, RawErrorDetails, Account, AccountStatus } from '@capitalos/core'\n\nexport { CapitalOSError, ErrorCode } from '@capitalos/core'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { EventEmitter, ElementRef, AfterViewInit, OnDestroy } from '@angular/core';
2
+ import { CapitalOSError, ThemeColorScheme, RenderingContext, IframeManagerConfig } from '@capitalos/core';
3
+ import { CapitalOsAuthService } from './capitalos-auth.service';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Common template for all iframe components.
7
+ * Angular doesn't support inheriting templates, so subclasses must use this constant.
8
+ */
9
+ export declare const IFRAME_COMPONENT_TEMPLATE = "<div #iframeContainer class=\"capitalos-iframe-container\"></div>";
10
+ /**
11
+ * Common styles for all iframe components.
12
+ * Angular doesn't support inheriting styles, so subclasses must use this constant.
13
+ *
14
+ * Why Angular needs these styles (unlike React/Vue):
15
+ * Angular component selectors (e.g., <capitalos-cards-app>) remain in the DOM as real elements.
16
+ * Without :host styling, the component element may collapse or not fill its container.
17
+ * In React/Vue, component tags are replaced by rendered content, so no wrapper styling is needed.
18
+ */
19
+ export declare const IFRAME_COMPONENT_STYLES: string[];
20
+ /**
21
+ * Component-specific callbacks to pass to IframeManager.
22
+ * Excludes common callbacks (onLoad, onError, onTokenExpired) which the base class handles.
23
+ */
24
+ export declare type ComponentCallbacks = Omit<IframeManagerConfig['callbacks'], 'onLoad' | 'onError' | 'onTokenExpired'>;
25
+ /**
26
+ * Abstract base class for CapitalOS iframe components.
27
+ *
28
+ * Handles common functionality:
29
+ * - Token subscription and iframe initialization
30
+ * - Common inputs (theme, heightOffsetPx, enableLogging)
31
+ * - Common outputs (loaded, error)
32
+ * - Lifecycle management (cleanup on destroy)
33
+ *
34
+ * Subclasses must implement:
35
+ * - `getRenderingContext()` - returns the component-specific rendering context
36
+ *
37
+ * Subclasses may override:
38
+ * - `getComponentCallbacks()` - returns component-specific Penpal callbacks
39
+ *
40
+ * Note: Rendering context inputs (e.g., entryPoint, exitPoint for Onboarding) are read once
41
+ * at iframe initialization. Changes to these inputs after the iframe loads will NOT trigger
42
+ * re-initialization. This matches the behavior of the React SDK.
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * @Component({ selector: 'my-component', ... })
47
+ * export class MyComponent extends BaseIframeComponent {
48
+ * protected getRenderingContext(): RenderingContext {
49
+ * return { entryPoint: 'myComponent' }
50
+ * }
51
+ * }
52
+ * ```
53
+ */
54
+ export declare abstract class BaseIframeComponent implements AfterViewInit, OnDestroy {
55
+ protected readonly authService: CapitalOsAuthService;
56
+ protected readonly config: import("./provide-capitalos").CapitalOsConfig;
57
+ theme?: ThemeColorScheme;
58
+ heightOffsetPx: number;
59
+ enableLogging?: boolean;
60
+ loaded: EventEmitter<void>;
61
+ error: EventEmitter<CapitalOSError>;
62
+ iframeContainer?: ElementRef<HTMLDivElement>;
63
+ private iframeManager?;
64
+ private tokenDataSubscription?;
65
+ ngAfterViewInit(): void;
66
+ ngOnDestroy(): void;
67
+ /**
68
+ * Returns the rendering context for this component.
69
+ * Must be implemented by subclasses.
70
+ */
71
+ protected abstract getRenderingContext(): RenderingContext;
72
+ /**
73
+ * Returns component-specific Penpal callbacks.
74
+ * Override in subclasses that need callbacks (e.g., Onboarding, TokenExchange).
75
+ */
76
+ protected getComponentCallbacks(): ComponentCallbacks;
77
+ private initializeIframe;
78
+ static ɵfac: i0.ɵɵFactoryDeclaration<BaseIframeComponent, never>;
79
+ static ɵdir: i0.ɵɵDirectiveDeclaration<BaseIframeComponent, never, never, { "theme": "theme"; "heightOffsetPx": "heightOffsetPx"; "enableLogging": "enableLogging"; }, { "loaded": "loaded"; "error": "error"; }, never, never, false>;
80
+ }
@@ -0,0 +1,23 @@
1
+ import { RenderingContext } from '@capitalos/core';
2
+ import { BaseIframeComponent } from './base-iframe.component';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * BillPayApp component that renders the CapitalOS bill payment interface in an iframe.
6
+ *
7
+ * The component emits events for loading state - consumers should handle their own loading UI:
8
+ *
9
+ * ```html
10
+ * <div *ngIf="!billPayLoaded">
11
+ * <my-loading-spinner></my-loading-spinner>
12
+ * </div>
13
+ * <capitalos-billpay-app
14
+ * (loaded)="billPayLoaded = true"
15
+ * (error)="onBillPayError($event)"
16
+ * ></capitalos-billpay-app>
17
+ * ```
18
+ */
19
+ export declare class BillPayAppComponent extends BaseIframeComponent {
20
+ protected getRenderingContext(): RenderingContext;
21
+ static ɵfac: i0.ɵɵFactoryDeclaration<BillPayAppComponent, never>;
22
+ static ɵcmp: i0.ɵɵComponentDeclaration<BillPayAppComponent, "capitalos-billpay-app", never, {}, {}, never, never, true>;
23
+ }
@@ -2,6 +2,8 @@ import { ModuleWithProviders } from '@angular/core';
2
2
  import { CapitalOsConfig } from './provide-capitalos';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "./cards-app.component";
5
+ import * as i2 from "./billpay-app.component";
6
+ import * as i3 from "./onboarding.component";
5
7
  /**
6
8
  * NgModule for CapitalOS SDK.
7
9
  *
@@ -28,6 +30,6 @@ import * as i1 from "./cards-app.component";
28
30
  export declare class CapitalOsModule {
29
31
  static forRoot(config: CapitalOsConfig): ModuleWithProviders<CapitalOsModule>;
30
32
  static ɵfac: i0.ɵɵFactoryDeclaration<CapitalOsModule, never>;
31
- static ɵmod: i0.ɵɵNgModuleDeclaration<CapitalOsModule, never, [typeof i1.CardsAppComponent], [typeof i1.CardsAppComponent]>;
33
+ static ɵmod: i0.ɵɵNgModuleDeclaration<CapitalOsModule, never, [typeof i1.CardsAppComponent, typeof i2.BillPayAppComponent, typeof i3.OnboardingComponent], [typeof i1.CardsAppComponent, typeof i2.BillPayAppComponent, typeof i3.OnboardingComponent]>;
32
34
  static ɵinj: i0.ɵɵInjectorDeclaration<CapitalOsModule>;
33
35
  }
@@ -1,5 +1,5 @@
1
- import { EventEmitter, ElementRef, AfterViewInit, OnDestroy } from '@angular/core';
2
- import { CapitalOSError, ThemeColorScheme } from '@capitalos/core';
1
+ import { RenderingContext } from '@capitalos/core';
2
+ import { BaseIframeComponent } from './base-iframe.component';
3
3
  import * as i0 from "@angular/core";
4
4
  /**
5
5
  * CardsApp component that renders the CapitalOS cards interface in an iframe.
@@ -16,20 +16,8 @@ import * as i0 from "@angular/core";
16
16
  * ></capitalos-cards-app>
17
17
  * ```
18
18
  */
19
- export declare class CardsAppComponent implements AfterViewInit, OnDestroy {
20
- private readonly authService;
21
- private readonly config;
22
- theme?: ThemeColorScheme;
23
- heightOffsetPx: number;
24
- enableLogging?: boolean;
25
- loaded: EventEmitter<void>;
26
- error: EventEmitter<CapitalOSError>;
27
- iframeContainer?: ElementRef<HTMLDivElement>;
28
- private iframeManager?;
29
- private tokenDataSubscription?;
30
- ngAfterViewInit(): void;
31
- ngOnDestroy(): void;
32
- private initializeIframe;
19
+ export declare class CardsAppComponent extends BaseIframeComponent {
20
+ protected getRenderingContext(): RenderingContext;
33
21
  static ɵfac: i0.ɵɵFactoryDeclaration<CardsAppComponent, never>;
34
- static ɵcmp: i0.ɵɵComponentDeclaration<CardsAppComponent, "capitalos-cards-app", never, { "theme": "theme"; "heightOffsetPx": "heightOffsetPx"; "enableLogging": "enableLogging"; }, { "loaded": "loaded"; "error": "error"; }, never, never, true>;
22
+ static ɵcmp: i0.ɵɵComponentDeclaration<CardsAppComponent, "capitalos-cards-app", never, {}, {}, never, never, true>;
35
23
  }
@@ -0,0 +1,32 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { RenderingContext, Account, OnboardingEntryPoint, OnboardingExitPoint } from '@capitalos/core';
3
+ import { BaseIframeComponent, ComponentCallbacks } from './base-iframe.component';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Onboarding component that renders the CapitalOS onboarding flow in an iframe.
7
+ *
8
+ * The component emits events for loading state and completion - consumers should handle their own loading UI:
9
+ *
10
+ * ```html
11
+ * <div *ngIf="!onboardingLoaded">
12
+ * <my-loading-spinner></my-loading-spinner>
13
+ * </div>
14
+ * <capitalos-onboarding
15
+ * [entryPoint]="'welcome'"
16
+ * [exitPoint]="'activation'"
17
+ * (loaded)="onboardingLoaded = true"
18
+ * (error)="onOnboardingError($event)"
19
+ * (done)="onOnboardingComplete($event)"
20
+ * ></capitalos-onboarding>
21
+ * ```
22
+ */
23
+ export declare class OnboardingComponent extends BaseIframeComponent {
24
+ entryPoint?: OnboardingEntryPoint;
25
+ exitPoint?: OnboardingExitPoint;
26
+ allowExitOnNonApproved?: boolean;
27
+ done: EventEmitter<Account>;
28
+ protected getRenderingContext(): RenderingContext;
29
+ protected getComponentCallbacks(): ComponentCallbacks;
30
+ static ɵfac: i0.ɵɵFactoryDeclaration<OnboardingComponent, never>;
31
+ static ɵcmp: i0.ɵɵComponentDeclaration<OnboardingComponent, "capitalos-onboarding", never, { "entryPoint": "entryPoint"; "exitPoint": "exitPoint"; "allowExitOnNonApproved": "allowExitOnNonApproved"; }, { "done": "done"; }, never, never, true>;
32
+ }
@@ -0,0 +1 @@
1
+ export declare const SDK_VERSION = "0.1.1";