{"_id":"@allstak/angular","_rev":"2-a7c3ec1ccb631e1c5970c8d4d66c4c25","name":"@allstak/angular","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@allstak/angular","version":"0.1.0","keywords":["angular","observability","error-tracking","logging","monitoring","tracing","allstak"],"author":{"name":"AllStak","email":"sdk@allstak.sa"},"license":"MIT","_id":"@allstak/angular@0.1.0","maintainers":[{"name":"allstak-","email":"hello@allstak.sa"}],"homepage":"https://allstak.sa","bugs":{"url":"https://github.com/AllStak/allstak-angular/issues"},"dist":{"shasum":"d7763bd3a0791d010ac0d3d68048890780037746","tarball":"https://registry.npmjs.org/@allstak/angular/-/angular-0.1.0.tgz","fileCount":28,"integrity":"sha512-bSRvAvPtZOe48kVV2HztmoX3JJb962/ZLs4UtakJOrQiTVTkrDQSe3sbDZbwY8o557h64n8Nsk9eJQ7mVOQZZw==","signatures":[{"sig":"MEUCIDNSl2nnbgKeVEQd3w/7IQpn1KjU9dYT+A85PI6VgRPzAiEAslSQSKtmWpX56ejzstvX1mhxoh43kJRHYFw50JwHKJ0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@allstak%2fangular@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":193693},"module":"fesm2022/allstak-angular.mjs","exports":{".":{"esm":"./esm2022/allstak-angular.mjs","types":"./index.d.ts","default":"./fesm2022/allstak-angular.mjs","esm2022":"./esm2022/allstak-angular.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"2dd0a006a84a5c198bfd875eb04106f618870579","typings":"index.d.ts","_npmUser":{"name":"allstak-","email":"hello@allstak.sa"},"repository":{"url":"git+https://github.com/AllStak/allstak-angular.git","type":"git"},"_npmVersion":"10.8.2","description":"Official AllStak SDK for Angular — error tracking, structured logs, distributed tracing, and observability for Angular applications.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"tslib":"^2.3.0","@allstak/js":"^0.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"peerDependencies":{"rxjs":"^6.5.5 || ^7.0.0","@angular/core":">=14.0.0 <19.0.0","@angular/common":">=14.0.0 <19.0.0","@angular/router":">=14.0.0 <19.0.0"},"peerDependenciesMeta":{"@angular/router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/angular_0.1.0_1780089181032_0.9038572821413227","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@allstak/angular","version":"0.2.0","description":"Official AllStak SDK for Angular — error tracking, structured logs, distributed tracing, and observability for Angular applications.","keywords":["angular","observability","error-tracking","logging","monitoring","tracing","allstak"],"homepage":"https://allstak.sa","repository":{"type":"git","url":"git+https://github.com/AllStak/allstak-angular.git"},"bugs":{"url":"https://github.com/AllStak/allstak-angular/issues"},"license":"MIT","author":{"name":"AllStak","email":"sdk@allstak.sa"},"sideEffects":false,"peerDependencies":{"@angular/common":">=14.0.0 <19.0.0","@angular/core":">=14.0.0 <19.0.0","@angular/router":">=14.0.0 <19.0.0","rxjs":"^6.5.5 || ^7.0.0"},"peerDependenciesMeta":{"@angular/router":{"optional":true}},"dependencies":{"@allstak/js":"^0.3.0","tslib":"^2.3.0"},"publishConfig":{"access":"public","provenance":true,"registry":"https://registry.npmjs.org/"},"module":"fesm2022/allstak-angular.mjs","typings":"index.d.ts","exports":{"./package.json":{"default":"./package.json"},".":{"types":"./index.d.ts","esm2022":"./esm2022/allstak-angular.mjs","esm":"./esm2022/allstak-angular.mjs","default":"./fesm2022/allstak-angular.mjs"}},"_id":"@allstak/angular@0.2.0","gitHead":"046a3b755f2875bf160f79d97d69e25de4d66586","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-j7znt8XFx5V9lQkXvtSkmIfNJio9oEXKCgAcBqLLYysxtg7OQkJgIAhsv5LJE2lN5Z4lKnLRDjwEwy9fDsCJkg==","shasum":"7642defa43787bdde9d668f566a00a3f30926eae","tarball":"https://registry.npmjs.org/@allstak/angular/-/angular-0.2.0.tgz","fileCount":28,"unpackedSize":207191,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@allstak%2fangular@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDUSRwI+CrwKAydPlYvwPK+7aT9Swk46eSl+I4Qc4BJawIgSzSZKP3VCMK6ju65rp5kLemxrb45T3ExaUL4TyFSnTs="}]},"_npmUser":{"name":"allstak-","email":"hello@allstak.sa"},"directories":{},"maintainers":[{"name":"allstak-","email":"hello@allstak.sa"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/angular_0.2.0_1780099094195_0.5008690588843872"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-29T21:13:00.904Z","modified":"2026-05-29T23:58:14.691Z","0.1.0":"2026-05-29T21:13:01.183Z","0.2.0":"2026-05-29T23:58:14.379Z"},"bugs":{"url":"https://github.com/AllStak/allstak-angular/issues"},"author":{"name":"AllStak","email":"sdk@allstak.sa"},"license":"MIT","homepage":"https://allstak.sa","keywords":["angular","observability","error-tracking","logging","monitoring","tracing","allstak"],"repository":{"type":"git","url":"git+https://github.com/AllStak/allstak-angular.git"},"description":"Official AllStak SDK for Angular — error tracking, structured logs, distributed tracing, and observability for Angular applications.","maintainers":[{"name":"allstak-","email":"hello@allstak.sa"}],"readme":"# @allstak/angular\n\n[![npm](https://img.shields.io/npm/v/@allstak/angular.svg)](https://www.npmjs.com/package/@allstak/angular)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\nOfficial AllStak SDK for **Angular**. Captures uncaught exceptions, structured logs, navigation spans, outbound HTTP requests, and component render timing — with first-class support for both standalone and NgModule-based apps.\n\n## Install\n\n```bash\nnpm install @allstak/angular\n# or\npnpm add @allstak/angular\n# or\nyarn add @allstak/angular\n```\n\n`@angular/core`, `@angular/common`, and `rxjs` are peer dependencies; `@angular/router` is an optional peer (only needed for navigation instrumentation).\n\n## Setup\n\nInitialise the SDK once in `main.ts`, **before** you bootstrap the app, so the global error handler and router instrumentation see a live client:\n\n```ts\nimport { init } from '@allstak/angular';\nimport { bootstrapApplication } from '@angular/platform-browser';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\ninit({\n  apiKey: 'your-ingest-key',\n  environment: 'production',\n});\n\nbootstrapApplication(AppComponent, appConfig);\n```\n\n## Standalone apps (provider functions)\n\nWire the DI pieces in `app.config.ts`:\n\n```ts\nimport { ApplicationConfig } from '@angular/core';\nimport { provideRouter } from '@angular/router';\nimport { provideHttpClient, withInterceptors } from '@angular/common/http';\nimport {\n  provideAllStak,\n  provideAllStakErrorHandler,\n  provideAllStakRouterInstrumentation,\n  allStakHttpInterceptor,\n} from '@allstak/angular';\nimport { routes } from './app.routes';\n\nexport const appConfig: ApplicationConfig = {\n  providers: [\n    provideRouter(routes),\n\n    // Bootstrap the SDK from DI (alternative to calling init() in main.ts).\n    provideAllStak({ apiKey: 'your-ingest-key', environment: 'production' }),\n\n    // Override Angular's global ErrorHandler — every uncaught error becomes an Issue.\n    provideAllStakErrorHandler(),\n\n    // Open a navigation span per route change.\n    provideAllStakRouterInstrumentation(),\n\n    // Record every outbound HTTP request + open a http.client span.\n    provideHttpClient(withInterceptors([allStakHttpInterceptor])),\n  ],\n};\n```\n\n## NgModule apps\n\n```ts\nimport { NgModule, ErrorHandler } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\nimport { AllStakModule, AllStakHttpInterceptor } from '@allstak/angular';\nimport { AppComponent } from './app.component';\n\n@NgModule({\n  declarations: [AppComponent],\n  imports: [\n    BrowserModule,\n\n    // forRoot() initialises the SDK, overrides ErrorHandler, force-instantiates\n    // the router TraceService, and exposes the [trace] directive.\n    AllStakModule.forRoot({ apiKey: 'your-ingest-key', environment: 'production' }),\n  ],\n  providers: [\n    provideHttpClient(withInterceptorsFromDi()),\n    { provide: HTTP_INTERCEPTORS, useClass: AllStakHttpInterceptor, multi: true },\n  ],\n  bootstrap: [AppComponent],\n})\nexport class AppModule {}\n```\n\n## Error handling\n\n`createErrorHandler()` returns an Angular `ErrorHandler` that forwards to `AllStak.captureException`. It unwraps the common Angular/zone.js error envelopes (`ngOriginalError`, promise `rejection`, `HttpErrorResponse.error`, `ErrorEvent.error`) before capture.\n\n```ts\nimport { ErrorHandler } from '@angular/core';\nimport { createErrorHandler } from '@allstak/angular';\n\nproviders: [\n  {\n    provide: ErrorHandler,\n    useValue: createErrorHandler({\n      logErrors: true, // also console.error the original (default)\n      extractor: (error, defaultExtractor) =>\n        (error as { cause?: unknown }).cause ?? defaultExtractor(error),\n    }),\n  },\n];\n```\n\n## Router instrumentation\n\n`TraceService` subscribes to Angular `Router` events and opens a `navigation` span per route change (finishing `ok` on `NavigationEnd`, `error` on `NavigationCancel` / `NavigationError`), plus a navigation breadcrumb. It must be force-instantiated — `provideAllStakRouterInstrumentation()` (standalone) or `AllStakModule.forRoot()` (NgModule) does that for you.\n\n## Component render timing\n\nThe `[trace]` directive opens a `ui.angular.init` span between a component's `ngOnInit` and `ngAfterViewInit`. Import `TraceDirective` directly (standalone) or `AllStakTraceModule` (NgModule):\n\n```ts\n// standalone component\nimport { Component } from '@angular/core';\nimport { TraceDirective } from '@allstak/angular';\n\n@Component({\n  standalone: true,\n  imports: [TraceDirective],\n  template: `<section trace=\"dashboard\">…</section>`,\n})\nexport class DashboardComponent {}\n```\n\nYou can also instrument classes/methods with the decorators (the `name` is required so spans survive minification):\n\n```ts\nimport { TraceClassDecorator, TraceMethodDecorator } from '@allstak/angular';\n\n@TraceClassDecorator({ name: 'CheckoutComponent' })\n@Component({ /* … */ })\nexport class CheckoutComponent {\n  @TraceMethodDecorator({ name: 'CheckoutComponent.ngOnInit' })\n  ngOnInit() {}\n}\n```\n\n## HTTP instrumentation\n\nThe interceptor records every outbound request as an `outbound` HTTP item and opens a `http.client` span around it (finished `error` on `4xx`/`5xx` or transport failure). Use the functional `allStakHttpInterceptor` with `withInterceptors([...])` or the class `AllStakHttpInterceptor` with `HTTP_INTERCEPTORS`. It never mutates the request.\n\n## Configuration\n\n`init(config)`, `provideAllStak(config)`, and `AllStakModule.forRoot(config)` all accept every option that `@allstak/js`'s `AllStak.init` accepts. Common options:\n\n| Option | Purpose |\n|---|---|\n| `apiKey` | Ingest key (required) |\n| `host` | Override the ingest host |\n| `environment` | e.g. `'production'` / `'development'` |\n| `release` | Release identifier for issue grouping / release health |\n| `tracesSampleRate` | Span sampling rate (0–1) |\n| `enableWebVitals` | Capture web vitals |\n| `enableAutoSessionTracking` | Release-health sessions |\n| `enableOfflineQueue` | Buffer events while offline |\n| `beforeSend` | Mutate/drop events before they are sent |\n\nThe full `@allstak/js` API is re-exported, so you can pull the entire observability surface from one import:\n\n```ts\nimport * as AllStakAngular from '@allstak/angular';\n\nAllStakAngular.AllStak.captureMessage('checkout started', 'info');\nconst span = AllStakAngular.AllStak.startSpan('checkout.flow', { description: 'review → pay' });\nspan.finish('ok');\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}