@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.
- package/esm2020/lib/base-iframe.component.mjs +139 -0
- package/esm2020/lib/billpay-app.component.mjs +30 -0
- package/esm2020/lib/capitalos.module.mjs +7 -5
- package/esm2020/lib/cards-app.component.mjs +10 -73
- package/esm2020/lib/onboarding.component.mjs +60 -0
- package/esm2020/lib/version.mjs +5 -0
- package/esm2020/public-api.mjs +3 -1
- package/fesm2015/capitalos-angular.mjs +190 -34
- package/fesm2015/capitalos-angular.mjs.map +1 -1
- package/fesm2020/capitalos-angular.mjs +187 -26
- package/fesm2020/capitalos-angular.mjs.map +1 -1
- package/lib/base-iframe.component.d.ts +80 -0
- package/lib/billpay-app.component.d.ts +23 -0
- package/lib/capitalos.module.d.ts +3 -1
- package/lib/cards-app.component.d.ts +5 -17
- package/lib/onboarding.component.d.ts +32 -0
- package/lib/version.d.ts +1 -0
- package/package.json +14 -3
- package/public-api.d.ts +3 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, inject, Injectable, EventEmitter,
|
|
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
|
-
//
|
|
222
|
-
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
229
|
-
*
|
|
230
|
-
*
|
|
231
|
-
*
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
*
|
|
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
|
|
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
|
-
//
|
|
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:
|
|
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
|
-
|
|
290
|
-
|
|
291
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type:
|
|
292
|
-
type:
|
|
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
|
+
BaseIframeComponent.ɵdir = 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 {
|
|
2
|
-
import {
|
|
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
|
|
20
|
-
|
|
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, {
|
|
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
|
+
}
|
package/lib/version.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const SDK_VERSION = "0.1.1";
|