@sneat/logging 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/esm2022/index.js +4 -0
  2. package/esm2022/index.js.map +1 -0
  3. package/esm2022/lib/analytics/fire-analytics.service.js +68 -0
  4. package/esm2022/lib/analytics/fire-analytics.service.js.map +1 -0
  5. package/esm2022/lib/analytics/index.js +2 -0
  6. package/esm2022/lib/analytics/index.js.map +1 -0
  7. package/esm2022/lib/analytics/multi-analytics.service.js +21 -0
  8. package/esm2022/lib/analytics/multi-analytics.service.js.map +1 -0
  9. package/esm2022/lib/analytics/posthog-analytics.service.js +47 -0
  10. package/esm2022/lib/analytics/posthog-analytics.service.js.map +1 -0
  11. package/esm2022/lib/analytics/provide-sneat-analytics.js +46 -0
  12. package/esm2022/lib/analytics/provide-sneat-analytics.js.map +1 -0
  13. package/esm2022/lib/error-logger.service.js +109 -0
  14. package/esm2022/lib/error-logger.service.js.map +1 -0
  15. package/esm2022/lib/sentry-setup.js +29 -0
  16. package/esm2022/lib/sentry-setup.js.map +1 -0
  17. package/esm2022/lib/sneat-logging.module.js +23 -0
  18. package/esm2022/lib/sneat-logging.module.js.map +1 -0
  19. package/esm2022/sneat-logging.js +5 -0
  20. package/esm2022/sneat-logging.js.map +1 -0
  21. package/lib/analytics/fire-analytics.service.d.ts +14 -0
  22. package/lib/analytics/multi-analytics.service.d.ts +9 -0
  23. package/lib/analytics/posthog-analytics.service.d.ts +11 -0
  24. package/lib/analytics/provide-sneat-analytics.d.ts +7 -0
  25. package/lib/error-logger.service.d.ts +12 -0
  26. package/lib/sentry-setup.d.ts +13 -0
  27. package/lib/sneat-logging.module.d.ts +8 -0
  28. package/package.json +14 -2
  29. package/sneat-logging.d.ts +5 -0
  30. package/eslint.config.js +0 -7
  31. package/ng-package.json +0 -7
  32. package/project.json +0 -38
  33. package/src/lib/analytics/analytics.service.spec.ts +0 -35
  34. package/src/lib/analytics/fire-analytics.service.spec.ts +0 -245
  35. package/src/lib/analytics/fire-analytics.service.ts +0 -92
  36. package/src/lib/analytics/multi-analytics.service.spec.ts +0 -112
  37. package/src/lib/analytics/multi-analytics.service.ts +0 -47
  38. package/src/lib/analytics/posthog-analytics.service.spec.ts +0 -123
  39. package/src/lib/analytics/posthog-analytics.service.ts +0 -46
  40. package/src/lib/analytics/provide-sneat-analytics.ts +0 -68
  41. package/src/lib/error-logger.service.spec.ts +0 -284
  42. package/src/lib/error-logger.service.ts +0 -131
  43. package/src/lib/sentry-setup.ts +0 -32
  44. package/src/lib/sneat-logging.module.ts +0 -16
  45. package/src/test-setup.ts +0 -3
  46. package/tsconfig.json +0 -13
  47. package/tsconfig.lib.json +0 -19
  48. package/tsconfig.lib.prod.json +0 -7
  49. package/tsconfig.spec.json +0 -31
  50. package/vite.config.mts +0 -10
  51. /package/{src/index.ts → index.d.ts} +0 -0
  52. /package/{src/lib/analytics/index.ts → lib/analytics/index.d.ts} +0 -0
@@ -0,0 +1,4 @@
1
+ export * from './lib/sentry-setup';
2
+ export * from './lib/sneat-logging.module';
3
+ export * from './lib/analytics';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/logging/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC","sourcesContent":["export * from './lib/sentry-setup';\nexport * from './lib/sneat-logging.module';\nexport * from './lib/analytics';\n"]}
@@ -0,0 +1,68 @@
1
+ import { inject, Injectable } from '@angular/core';
2
+ import { Analytics, logEvent, setUserId, setUserProperties, } from '@angular/fire/analytics';
3
+ import { ErrorLogger } from '@sneat/core';
4
+ import * as i0 from "@angular/core";
5
+ const logErrOptions = { show: false, feedback: false };
6
+ export class FireAnalyticsService {
7
+ constructor() {
8
+ this.errorLogger = inject(ErrorLogger);
9
+ this.analytics = inject(Analytics);
10
+ this.logError = (e, m) => this.errorLogger.logError(e, m, logErrOptions);
11
+ if (!this.errorLogger) {
12
+ console.error(`FireAnalyticsService() - !errorLogger`);
13
+ }
14
+ if (!this.analytics) {
15
+ console.error(`FireAnalyticsService() - !analytics`);
16
+ }
17
+ }
18
+ logEvent(eventName, eventParams, options) {
19
+ try {
20
+ logEvent(this.analytics, eventName, eventParams, options);
21
+ }
22
+ catch (e) {
23
+ this.logError(e, 'Failed to log event to Firebase analytics');
24
+ }
25
+ }
26
+ setCurrentScreen(screenName, options) {
27
+ try {
28
+ const args = { screenName: screenName };
29
+ logEvent(this.analytics, '$screen_view', args, options);
30
+ }
31
+ catch (e) {
32
+ this.logError(e, 'Failed to log screen view to Firebase analytics');
33
+ }
34
+ }
35
+ identify(userID, userPropertiesToSet, userPropertiesToSetOnce) {
36
+ try {
37
+ setUserId(this.analytics, userID);
38
+ }
39
+ catch (e) {
40
+ this.logError(e, 'Failed to set user id in Firebase analytics');
41
+ }
42
+ const customProperties = {};
43
+ if (userPropertiesToSet)
44
+ Object.keys(userPropertiesToSet).forEach((k) => (customProperties[k] = userPropertiesToSet[k]));
45
+ if (userPropertiesToSetOnce)
46
+ Object.keys(userPropertiesToSetOnce).forEach((k) => (customProperties[k] = userPropertiesToSetOnce[k]));
47
+ try {
48
+ setUserProperties(this.analytics, customProperties);
49
+ }
50
+ catch (e) {
51
+ this.logError(e, 'Failed to set user props in Firebase analytics');
52
+ }
53
+ }
54
+ loggedOut() {
55
+ try {
56
+ setUserId(this.analytics, null);
57
+ }
58
+ catch (e) {
59
+ this.logError(e, 'Failed to logout user from Firebase analytics');
60
+ }
61
+ }
62
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FireAnalyticsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
63
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FireAnalyticsService }); }
64
+ }
65
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FireAnalyticsService, decorators: [{
66
+ type: Injectable
67
+ }], ctorParameters: () => [] });
68
+ //# sourceMappingURL=fire-analytics.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fire-analytics.service.js","sourceRoot":"","sources":["../../../../../../libs/logging/src/lib/analytics/fire-analytics.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport {\n Analytics,\n logEvent,\n setUserId,\n setUserProperties,\n} from '@angular/fire/analytics';\nimport { ErrorLogger, IErrorLogger, ILogErrorOptions } from '@sneat/core';\nimport {\n IAnalyticsCallOptions,\n IAnalyticsService,\n UserProperties,\n} from '@sneat/core';\n\nconst logErrOptions: ILogErrorOptions = { show: false, feedback: false };\n\n@Injectable()\nexport class FireAnalyticsService implements IAnalyticsService {\n private readonly errorLogger = inject<IErrorLogger>(ErrorLogger);\n private readonly analytics = inject(Analytics);\n\n constructor() {\n if (!this.errorLogger) {\n console.error(`FireAnalyticsService() - !errorLogger`);\n }\n if (!this.analytics) {\n console.error(`FireAnalyticsService() - !analytics`);\n }\n }\n\n private readonly logError = (e: unknown, m: string) =>\n this.errorLogger.logError(e, m, logErrOptions);\n\n public logEvent(\n eventName: string,\n eventParams?: Record<string, unknown>,\n options?: IAnalyticsCallOptions,\n ): void {\n try {\n logEvent(this.analytics, eventName, eventParams, options);\n } catch (e) {\n this.logError(e, 'Failed to log event to Firebase analytics');\n }\n }\n\n public setCurrentScreen(\n screenName: string,\n options?: IAnalyticsCallOptions,\n ): void {\n try {\n const args = { screenName: screenName };\n logEvent(this.analytics, '$screen_view', args, options);\n } catch (e) {\n this.logError(e, 'Failed to log screen view to Firebase analytics');\n }\n }\n\n public identify(\n userID: string,\n userPropertiesToSet?: UserProperties,\n userPropertiesToSetOnce?: UserProperties,\n ): void {\n try {\n setUserId(this.analytics, userID);\n } catch (e) {\n this.logError(e, 'Failed to set user id in Firebase analytics');\n }\n const customProperties: { [id: string]: unknown } = {};\n\n if (userPropertiesToSet)\n Object.keys(userPropertiesToSet).forEach(\n (k) => (customProperties[k] = userPropertiesToSet[k]),\n );\n if (userPropertiesToSetOnce)\n Object.keys(userPropertiesToSetOnce).forEach(\n (k) => (customProperties[k] = userPropertiesToSetOnce[k]),\n );\n try {\n setUserProperties(this.analytics, customProperties);\n } catch (e) {\n this.logError(e, 'Failed to set user props in Firebase analytics');\n }\n }\n\n public loggedOut(): void {\n try {\n setUserId(this.analytics, null);\n } catch (e) {\n this.logError(e, 'Failed to logout user from Firebase analytics');\n }\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export * from './provide-sneat-analytics';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/logging/src/lib/analytics/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC","sourcesContent":["export * from './provide-sneat-analytics';\n"]}
@@ -0,0 +1,21 @@
1
+ const prefix = 'MultiAnalyticsService.';
2
+ export class MultiAnalyticsService {
3
+ constructor(as) {
4
+ this.as = as;
5
+ console.log(prefix +
6
+ `.constructor() as=[${as.map((a) => a.constructor.name).join(',')}]`);
7
+ }
8
+ identify(userID, userPropsToSet, userPropsToSetOnce) {
9
+ this.as.forEach((as) => setTimeout(() => as.identify(userID, userPropsToSet, userPropsToSetOnce)));
10
+ }
11
+ logEvent(eventName, eventParams, options) {
12
+ this.as.forEach((as) => setTimeout(() => as.logEvent(eventName, eventParams, options)));
13
+ }
14
+ setCurrentScreen(screenName, options) {
15
+ this.as.forEach((as) => as.setCurrentScreen(screenName, options));
16
+ }
17
+ loggedOut() {
18
+ this.as.forEach((as) => setTimeout(() => as.loggedOut()));
19
+ }
20
+ }
21
+ //# sourceMappingURL=multi-analytics.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-analytics.service.js","sourceRoot":"","sources":["../../../../../../libs/logging/src/lib/analytics/multi-analytics.service.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,GAAG,wBAAwB,CAAC;AAExC,MAAM,OAAO,qBAAqB;IAChC,YAA6B,EAAgC;QAAhC,OAAE,GAAF,EAAE,CAA8B;QAC3D,OAAO,CAAC,GAAG,CACT,MAAM;YACJ,sBAAsB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CACvE,CAAC;IACJ,CAAC;IAEM,QAAQ,CACb,MAAc,EACd,cAA+B,EAC/B,kBAAmC;QAEnC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CACrB,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,kBAAkB,CAAC,CAAC,CAC1E,CAAC;IACJ,CAAC;IAEM,QAAQ,CACb,SAAiB,EACjB,WAA+C,EAC/C,OAA+B;QAE/B,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CACrB,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAC/D,CAAC;IACJ,CAAC;IAEM,gBAAgB,CACrB,UAAkB,EAClB,OAA+B;QAE/B,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IACpE,CAAC;IAEM,SAAS;QACd,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;CACF","sourcesContent":["import {\n IAnalyticsCallOptions,\n IAnalyticsService,\n UserProperties,\n} from '@sneat/core';\n\nconst prefix = 'MultiAnalyticsService.';\n\nexport class MultiAnalyticsService implements IAnalyticsService {\n constructor(private readonly as: readonly IAnalyticsService[]) {\n console.log(\n prefix +\n `.constructor() as=[${as.map((a) => a.constructor.name).join(',')}]`,\n );\n }\n\n public identify(\n userID: string,\n userPropsToSet?: UserProperties,\n userPropsToSetOnce?: UserProperties,\n ): void {\n this.as.forEach((as) =>\n setTimeout(() => as.identify(userID, userPropsToSet, userPropsToSetOnce)),\n );\n }\n\n public logEvent(\n eventName: string,\n eventParams?: Readonly<Record<string, unknown>>,\n options?: IAnalyticsCallOptions,\n ): void {\n this.as.forEach((as) =>\n setTimeout(() => as.logEvent(eventName, eventParams, options)),\n );\n }\n\n public setCurrentScreen(\n screenName: string,\n options?: IAnalyticsCallOptions,\n ): void {\n this.as.forEach((as) => as.setCurrentScreen(screenName, options));\n }\n\n public loggedOut(): void {\n this.as.forEach((as) => setTimeout(() => as.loggedOut()));\n }\n}\n"]}
@@ -0,0 +1,47 @@
1
+ import { inject, Injectable } from '@angular/core';
2
+ import { ErrorLogger } from '@sneat/core';
3
+ import posthog from 'posthog-js';
4
+ import * as i0 from "@angular/core";
5
+ const ph = posthog;
6
+ export class PosthogAnalyticsService {
7
+ constructor() {
8
+ this.errorLogger = inject(ErrorLogger);
9
+ }
10
+ identify(userID) {
11
+ ph.identify(userID);
12
+ }
13
+ logEvent(eventName, eventParams) {
14
+ try {
15
+ ph.capture(eventName, eventParams);
16
+ }
17
+ catch (e) {
18
+ this.errorLogger.logError(e, 'Failed to log event to Posthog', {
19
+ show: false,
20
+ });
21
+ }
22
+ }
23
+ setCurrentScreen(screenName) {
24
+ try {
25
+ ph.capture('$screen_view', { screen_name: screenName });
26
+ }
27
+ catch (e) {
28
+ this.errorLogger.logError(e, 'Failed to log screen view to Posthog', {
29
+ show: false,
30
+ });
31
+ }
32
+ }
33
+ loggedOut() {
34
+ try {
35
+ ph.reset();
36
+ }
37
+ catch (e) {
38
+ this.errorLogger.logError(e, 'Failed to reset Posthog', { show: false });
39
+ }
40
+ }
41
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PosthogAnalyticsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
42
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PosthogAnalyticsService }); }
43
+ }
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PosthogAnalyticsService, decorators: [{
45
+ type: Injectable
46
+ }] });
47
+ //# sourceMappingURL=posthog-analytics.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posthog-analytics.service.js","sourceRoot":"","sources":["../../../../../../libs/logging/src/lib/analytics/posthog-analytics.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AACxD,OAAO,OAAoB,MAAM,YAAY,CAAC;;AAG9C,MAAM,EAAE,GAAG,OAA6B,CAAC;AAGzC,MAAM,OAAO,uBAAuB;IADpC;QAEU,gBAAW,GAAG,MAAM,CAAe,WAAW,CAAC,CAAC;KAoCzD;IAlCQ,QAAQ,CAAC,MAAc;QAC5B,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAEM,QAAQ,CACb,SAAiB,EACjB,WAA+C;QAE/C,IAAI,CAAC;YACH,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,gCAAgC,EAAE;gBAC7D,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEM,gBAAgB,CAAC,UAAkB;QACxC,IAAI,CAAC;YACH,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,sCAAsC,EAAE;gBACnE,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEM,SAAS;QACd,IAAI,CAAC;YACH,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,yBAAyB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;8GApCU,uBAAuB;kHAAvB,uBAAuB;;2FAAvB,uBAAuB;kBADnC,UAAU","sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { ErrorLogger, IErrorLogger } from '@sneat/core';\nimport posthog, { PostHog } from 'posthog-js';\nimport { IAnalyticsService } from '@sneat/core';\n\nconst ph = posthog as unknown as PostHog;\n\n@Injectable()\nexport class PosthogAnalyticsService implements IAnalyticsService {\n private errorLogger = inject<IErrorLogger>(ErrorLogger);\n\n public identify(userID: string): void {\n ph.identify(userID);\n }\n\n public logEvent(\n eventName: string,\n eventParams?: Readonly<Record<string, unknown>>,\n ): void {\n try {\n ph.capture(eventName, eventParams);\n } catch (e) {\n this.errorLogger.logError(e, 'Failed to log event to Posthog', {\n show: false,\n });\n }\n }\n\n public setCurrentScreen(screenName: string): void {\n try {\n ph.capture('$screen_view', { screen_name: screenName });\n } catch (e) {\n this.errorLogger.logError(e, 'Failed to log screen view to Posthog', {\n show: false,\n });\n }\n }\n\n public loggedOut() {\n try {\n ph.reset();\n } catch (e) {\n this.errorLogger.logError(e, 'Failed to reset Posthog', { show: false });\n }\n }\n}\n"]}
@@ -0,0 +1,46 @@
1
+ import { getAnalytics } from '@angular/fire/analytics';
2
+ import { FirebaseApp } from '@angular/fire/app';
3
+ import { AnalyticsService, } from '@sneat/core';
4
+ import { ErrorLogger } from '@sneat/core';
5
+ import { FireAnalyticsService } from './fire-analytics.service';
6
+ import { MultiAnalyticsService } from './multi-analytics.service';
7
+ import { PosthogAnalyticsService } from './posthog-analytics.service';
8
+ function getAnalyticsConfig(environmentConfig) {
9
+ const useAnalytics = location.host === 'sneat.app' || location.protocol === 'https:';
10
+ const firebaseMeasurementId = environmentConfig.firebaseConfig?.measurementId;
11
+ return {
12
+ addPosthog: useAnalytics && !!environmentConfig.posthog?.token,
13
+ addFirebaseAnalytics: useAnalytics &&
14
+ !!firebaseMeasurementId &&
15
+ firebaseMeasurementId !== 'G-PROVIDE_IF_NEEDED',
16
+ };
17
+ }
18
+ export function provideSneatAnalytics(environmentConfig) {
19
+ return {
20
+ provide: AnalyticsService,
21
+ deps: [
22
+ ErrorLogger,
23
+ FirebaseApp,
24
+ // [new Optional(), Analytics], // TODO: The received Analytics instance does not have app property :(
25
+ ],
26
+ useFactory: (errorLogger, fbApp) => {
27
+ const config = getAnalyticsConfig(environmentConfig);
28
+ const as = [];
29
+ if (config?.addPosthog) {
30
+ as.push(new PosthogAnalyticsService());
31
+ }
32
+ if (config?.addFirebaseAnalytics) {
33
+ const analytics = fbApp && getAnalytics(fbApp); // Ideally we would want to get it from the DI
34
+ if (analytics) {
35
+ as.push(new FireAnalyticsService());
36
+ // as.push(new FireAnalyticsService(errorLogger, analytics));
37
+ }
38
+ else {
39
+ errorLogger.logError('addFirebaseAnalytics==true, but Firebase Analytics is not provided', undefined, { show: false, feedback: false });
40
+ }
41
+ }
42
+ return new MultiAnalyticsService(as);
43
+ },
44
+ };
45
+ }
46
+ //# sourceMappingURL=provide-sneat-analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provide-sneat-analytics.js","sourceRoot":"","sources":["../../../../../../libs/logging/src/lib/analytics/provide-sneat-analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,gBAAgB,GAGjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAQtE,SAAS,kBAAkB,CACzB,iBAAqC;IAErC,MAAM,YAAY,GAChB,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC;IAElE,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,cAAc,EAAE,aAAa,CAAC;IAE9E,OAAO;QACL,UAAU,EAAE,YAAY,IAAI,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK;QAC9D,oBAAoB,EAClB,YAAY;YACZ,CAAC,CAAC,qBAAqB;YACvB,qBAAqB,KAAK,qBAAqB;KAClD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,iBAAqC;IAErC,OAAO;QACL,OAAO,EAAE,gBAAgB;QACzB,IAAI,EAAE;YACJ,WAAW;YACX,WAAW;YACX,sGAAsG;SACvG;QACD,UAAU,EAAE,CAAC,WAAyB,EAAE,KAAkB,EAAE,EAAE;YAC5D,MAAM,MAAM,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;YACrD,MAAM,EAAE,GAAwB,EAAE,CAAC;YACnC,IAAI,MAAM,EAAE,UAAU,EAAE,CAAC;gBACvB,EAAE,CAAC,IAAI,CAAC,IAAI,uBAAuB,EAAE,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,MAAM,EAAE,oBAAoB,EAAE,CAAC;gBACjC,MAAM,SAAS,GAAc,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,8CAA8C;gBACzG,IAAI,SAAS,EAAE,CAAC;oBACd,EAAE,CAAC,IAAI,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;oBACpC,6DAA6D;gBAC/D,CAAC;qBAAM,CAAC;oBACN,WAAW,CAAC,QAAQ,CAClB,oEAAoE,EACpE,SAAS,EACT,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CACjC,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,IAAI,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { Analytics, getAnalytics } from '@angular/fire/analytics';\nimport { FirebaseApp } from '@angular/fire/app';\nimport {\n AnalyticsService,\n IAnalyticsService,\n IEnvironmentConfig,\n} from '@sneat/core';\nimport { ErrorLogger, IErrorLogger } from '@sneat/core';\nimport { FireAnalyticsService } from './fire-analytics.service';\nimport { MultiAnalyticsService } from './multi-analytics.service';\nimport { PosthogAnalyticsService } from './posthog-analytics.service';\nimport { Provider } from '@angular/core';\n\nexport interface IAnalyticsConfig {\n addPosthog?: boolean;\n addFirebaseAnalytics?: boolean;\n}\n\nfunction getAnalyticsConfig(\n environmentConfig: IEnvironmentConfig,\n): IAnalyticsConfig {\n const useAnalytics =\n location.host === 'sneat.app' || location.protocol === 'https:';\n\n const firebaseMeasurementId = environmentConfig.firebaseConfig?.measurementId;\n\n return {\n addPosthog: useAnalytics && !!environmentConfig.posthog?.token,\n addFirebaseAnalytics:\n useAnalytics &&\n !!firebaseMeasurementId &&\n firebaseMeasurementId !== 'G-PROVIDE_IF_NEEDED',\n };\n}\n\nexport function provideSneatAnalytics(\n environmentConfig: IEnvironmentConfig,\n): Provider {\n return {\n provide: AnalyticsService,\n deps: [\n ErrorLogger,\n FirebaseApp,\n // [new Optional(), Analytics], // TODO: The received Analytics instance does not have app property :(\n ],\n useFactory: (errorLogger: IErrorLogger, fbApp: FirebaseApp) => {\n const config = getAnalyticsConfig(environmentConfig);\n const as: IAnalyticsService[] = [];\n if (config?.addPosthog) {\n as.push(new PosthogAnalyticsService());\n }\n if (config?.addFirebaseAnalytics) {\n const analytics: Analytics = fbApp && getAnalytics(fbApp); // Ideally we would want to get it from the DI\n if (analytics) {\n as.push(new FireAnalyticsService());\n // as.push(new FireAnalyticsService(errorLogger, analytics));\n } else {\n errorLogger.logError(\n 'addFirebaseAnalytics==true, but Firebase Analytics is not provided',\n undefined,\n { show: false, feedback: false },\n );\n }\n }\n return new MultiAnalyticsService(as);\n },\n };\n}\n"]}
@@ -0,0 +1,109 @@
1
+ import { HttpErrorResponse } from '@angular/common/http';
2
+ import { Injectable, Optional } from '@angular/core';
3
+ import { ToastController } from '@ionic/angular/standalone';
4
+ import { captureException, showReportDialog } from '@sentry/angular';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@ionic/angular/standalone";
7
+ const defaultErrorToastDuration = 7000;
8
+ export class ErrorLoggerService {
9
+ constructor(toastController) {
10
+ this.toastController = toastController;
11
+ this.logErrorHandler = (message, options) => (e) => this.logError(e, message, options);
12
+ this.logError = (e, message, options) => {
13
+ console.error(`ErrorLoggerService.logError: ${message || 'Error'}:`, e, '; Logging options:', options);
14
+ if (e === true || e === false) {
15
+ try {
16
+ // noinspection ExceptionCaughtLocallyJS
17
+ throw new Error(`got boolean value as an error: ${e}: ${message}`);
18
+ }
19
+ catch (ex) {
20
+ console.error('Argument exception at logError():', ex, options);
21
+ return;
22
+ }
23
+ }
24
+ if (options?.report === undefined || options.report) {
25
+ if (window.location.hostname !== 'localhost') {
26
+ try {
27
+ const eventId = message
28
+ ? captureException(message, { originalException: e })
29
+ : captureException(e);
30
+ // console.log('Captured error by Sentry with eventId:', eventId);
31
+ if (options?.feedback === undefined || options.feedback) {
32
+ showReportDialog({ eventId });
33
+ }
34
+ }
35
+ catch (ex) {
36
+ console.error('Sentry failed to capture or show error report dialog', ex);
37
+ }
38
+ }
39
+ }
40
+ if (options?.show || options?.show === undefined) {
41
+ this.showError(e, options?.showDuration);
42
+ }
43
+ return; // return message ? { error: e, message } : e;
44
+ };
45
+ }
46
+ showError(e, duration) {
47
+ let clientMessage;
48
+ if (e.message) {
49
+ clientMessage =
50
+ (clientMessage &&
51
+ `${clientMessage}: ${e.message}`) ||
52
+ e.message;
53
+ }
54
+ else if (!clientMessage) {
55
+ clientMessage = e.toString();
56
+ }
57
+ if (!clientMessage) {
58
+ throw new Error('showError() have not received a message to display');
59
+ }
60
+ if (duration && duration < 0) {
61
+ throw new Error('showError received negative duration');
62
+ }
63
+ let message = clientMessage;
64
+ let serverMessage;
65
+ if (e instanceof HttpErrorResponse) {
66
+ const e2 = e;
67
+ serverMessage = e2.error?.error?.message;
68
+ if (serverMessage) {
69
+ message += `.\n\nServer returned error message: ${serverMessage}`;
70
+ }
71
+ }
72
+ if (!this.toastController) {
73
+ console.warn('ToastController not available, cannot show error toast');
74
+ return;
75
+ }
76
+ this.toastController
77
+ .create({
78
+ message,
79
+ duration: duration || defaultErrorToastDuration,
80
+ keyboardClose: true,
81
+ buttons: [
82
+ {
83
+ icon: 'close',
84
+ side: 'end',
85
+ handler: () => this.toastController.dismiss().catch((e) => this.logError(e, 'Failed to dismiss error dialog', {
86
+ show: false,
87
+ })),
88
+ },
89
+ ],
90
+ color: 'danger',
91
+ header: 'Something went wrong',
92
+ position: 'top',
93
+ })
94
+ .then((toast) => toast
95
+ .present()
96
+ .catch(this.logErrorHandler('Failed to present toast with error message:', { show: false })))
97
+ .catch(this.logErrorHandler('Failed to create a toast with error message:', {
98
+ show: false,
99
+ }));
100
+ }
101
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ErrorLoggerService, deps: [{ token: i1.ToastController, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
102
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ErrorLoggerService }); }
103
+ }
104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ErrorLoggerService, decorators: [{
105
+ type: Injectable
106
+ }], ctorParameters: () => [{ type: i1.ToastController, decorators: [{
107
+ type: Optional
108
+ }] }] });
109
+ //# sourceMappingURL=error-logger.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-logger.service.js","sourceRoot":"","sources":["../../../../../libs/logging/src/lib/error-logger.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { HttpErrorResponse } from '@angular/common/http';\nimport { Injectable, Optional } from '@angular/core';\nimport { ToastController } from '@ionic/angular/standalone';\nimport { captureException, showReportDialog } from '@sentry/angular';\nimport { IErrorLogger, ILogErrorOptions } from '@sneat/core';\n\nconst defaultErrorToastDuration = 7000;\n\n@Injectable()\nexport class ErrorLoggerService implements IErrorLogger {\n constructor(@Optional() private readonly toastController: ToastController) {}\n\n public readonly logErrorHandler =\n (message?: string, options?: ILogErrorOptions) => (e: unknown) =>\n this.logError(e, message, options);\n\n public readonly logError = (\n e: unknown,\n message?: string,\n options?: ILogErrorOptions,\n ): void => {\n console.error(\n `ErrorLoggerService.logError: ${message || 'Error'}:`,\n e,\n '; Logging options:',\n options,\n );\n if (e === true || e === false) {\n try {\n // noinspection ExceptionCaughtLocallyJS\n throw new Error(`got boolean value as an error: ${e}: ${message}`);\n } catch (ex) {\n console.error('Argument exception at logError():', ex, options);\n return;\n }\n }\n if (options?.report === undefined || options.report) {\n if (window.location.hostname !== 'localhost') {\n try {\n const eventId = message\n ? captureException(message, { originalException: e })\n : captureException(e);\n\n // console.log('Captured error by Sentry with eventId:', eventId);\n if (options?.feedback === undefined || options.feedback) {\n showReportDialog({ eventId });\n }\n } catch (ex) {\n console.error(\n 'Sentry failed to capture or show error report dialog',\n ex,\n );\n }\n }\n }\n if (options?.show || options?.show === undefined) {\n this.showError(e, options?.showDuration);\n }\n return; // return message ? { error: e, message } : e;\n };\n\n public showError(e: unknown, duration?: number): void {\n let clientMessage: string | undefined;\n\n if ((e as { message?: string }).message) {\n clientMessage =\n (clientMessage &&\n `${clientMessage}: ${(e as { message?: string }).message}`) ||\n (e as { message?: string }).message;\n } else if (!clientMessage) {\n clientMessage = (e as object).toString();\n }\n if (!clientMessage) {\n throw new Error('showError() have not received a message to display');\n }\n if (duration && duration < 0) {\n throw new Error('showError received negative duration');\n }\n\n let message = clientMessage;\n\n let serverMessage: string | undefined;\n if (e instanceof HttpErrorResponse) {\n const e2 = e as HttpErrorResponse;\n serverMessage = e2.error?.error?.message;\n if (serverMessage) {\n message += `.\\n\\nServer returned error message: ${serverMessage}`;\n }\n }\n if (!this.toastController) {\n console.warn('ToastController not available, cannot show error toast');\n return;\n }\n this.toastController\n .create({\n message,\n duration: duration || defaultErrorToastDuration,\n keyboardClose: true,\n buttons: [\n {\n icon: 'close',\n side: 'end',\n handler: () =>\n this.toastController.dismiss().catch((e) =>\n this.logError(e, 'Failed to dismiss error dialog', {\n show: false,\n }),\n ),\n },\n ],\n color: 'danger',\n header: 'Something went wrong',\n position: 'top',\n })\n .then((toast) =>\n toast\n .present()\n .catch(\n this.logErrorHandler(\n 'Failed to present toast with error message:',\n { show: false },\n ),\n ),\n )\n .catch(\n this.logErrorHandler('Failed to create a toast with error message:', {\n show: false,\n }),\n );\n }\n}\n"]}
@@ -0,0 +1,29 @@
1
+ import { inject, provideAppInitializer, ErrorHandler } from '@angular/core';
2
+ import { TraceService, init, createErrorHandler } from '@sentry/angular';
3
+ import { Router } from '@angular/router';
4
+ export const provideSentryAppInitializer = (options) => {
5
+ initSentry(options);
6
+ return [
7
+ ...sentryAppInitializerProviders,
8
+ provideAppInitializer(() => {
9
+ inject(TraceService);
10
+ }),
11
+ ];
12
+ };
13
+ function initSentry(options) {
14
+ // console.log('initSentry()');
15
+ init(options);
16
+ }
17
+ const sentryAppInitializerProviders = [
18
+ {
19
+ provide: TraceService,
20
+ deps: [Router],
21
+ },
22
+ {
23
+ provide: ErrorHandler,
24
+ useValue: createErrorHandler({
25
+ showDialog: true,
26
+ }),
27
+ },
28
+ ];
29
+ //# sourceMappingURL=sentry-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry-setup.js","sourceRoot":"","sources":["../../../../../libs/logging/src/lib/sentry-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,OAAuB,EAAE,EAAE;IACrE,UAAU,CAAC,OAAO,CAAC,CAAC;IACpB,OAAO;QACL,GAAG,6BAA6B;QAChC,qBAAqB,CAAC,GAAG,EAAE;YACzB,MAAM,CAAC,YAAY,CAAC,CAAC;QACvB,CAAC,CAAC;KACH,CAAC;AACJ,CAAC,CAAC;AAEF,SAAS,UAAU,CAAC,OAAuB;IACzC,+BAA+B;IAC/B,IAAI,CAAC,OAAO,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,6BAA6B,GAAG;IACpC;QACE,OAAO,EAAE,YAAY;QACrB,IAAI,EAAE,CAAC,MAAM,CAAC;KACf;IACD;QACE,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,kBAAkB,CAAC;YAC3B,UAAU,EAAE,IAAI;SACjB,CAAC;KACH;CACF,CAAC","sourcesContent":["import { inject, provideAppInitializer, ErrorHandler } from '@angular/core';\nimport { TraceService, init, createErrorHandler } from '@sentry/angular';\nimport { Router } from '@angular/router';\nimport { BrowserOptions } from '@sentry/browser';\n\nexport const provideSentryAppInitializer = (options: BrowserOptions) => {\n initSentry(options);\n return [\n ...sentryAppInitializerProviders,\n provideAppInitializer(() => {\n inject(TraceService);\n }),\n ];\n};\n\nfunction initSentry(options: BrowserOptions): void {\n // console.log('initSentry()');\n init(options);\n}\n\nconst sentryAppInitializerProviders = [\n {\n provide: TraceService,\n deps: [Router],\n },\n {\n provide: ErrorHandler,\n useValue: createErrorHandler({\n showDialog: true,\n }),\n },\n];\n"]}
@@ -0,0 +1,23 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { ErrorLogger } from '@sneat/core';
3
+ import { ErrorLoggerService } from './error-logger.service';
4
+ import * as i0 from "@angular/core";
5
+ export function provideErrorLogger() {
6
+ return {
7
+ provide: ErrorLogger,
8
+ useClass: ErrorLoggerService,
9
+ };
10
+ }
11
+ export class SneatLoggingModule {
12
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SneatLoggingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
13
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.0", ngImport: i0, type: SneatLoggingModule }); }
14
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SneatLoggingModule, providers: [provideErrorLogger()] }); }
15
+ }
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SneatLoggingModule, decorators: [{
17
+ type: NgModule,
18
+ args: [{
19
+ imports: [],
20
+ providers: [provideErrorLogger()],
21
+ }]
22
+ }] });
23
+ //# sourceMappingURL=sneat-logging.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sneat-logging.module.js","sourceRoot":"","sources":["../../../../../libs/logging/src/lib/sneat-logging.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAY,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;;AAE5D,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,OAAO,EAAE,WAAW;QACpB,QAAQ,EAAE,kBAAkB;KAC7B,CAAC;AACJ,CAAC;AAMD,MAAM,OAAO,kBAAkB;8GAAlB,kBAAkB;+GAAlB,kBAAkB;+GAAlB,kBAAkB,aAFlB,CAAC,kBAAkB,EAAE,CAAC;;2FAEtB,kBAAkB;kBAJ9B,QAAQ;mBAAC;oBACR,OAAO,EAAE,EAAE;oBACX,SAAS,EAAE,CAAC,kBAAkB,EAAE,CAAC;iBAClC","sourcesContent":["import { NgModule, Provider } from '@angular/core';\nimport { ErrorLogger } from '@sneat/core';\nimport { ErrorLoggerService } from './error-logger.service';\n\nexport function provideErrorLogger(): Provider {\n return {\n provide: ErrorLogger,\n useClass: ErrorLoggerService,\n };\n}\n\n@NgModule({\n imports: [],\n providers: [provideErrorLogger()],\n})\nexport class SneatLoggingModule {}\n"]}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=sneat-logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sneat-logging.js","sourceRoot":"","sources":["../../../../libs/logging/src/sneat-logging.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC","sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"]}
@@ -0,0 +1,14 @@
1
+ import { IAnalyticsCallOptions, IAnalyticsService, UserProperties } from '@sneat/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare class FireAnalyticsService implements IAnalyticsService {
4
+ private readonly errorLogger;
5
+ private readonly analytics;
6
+ constructor();
7
+ private readonly logError;
8
+ logEvent(eventName: string, eventParams?: Record<string, unknown>, options?: IAnalyticsCallOptions): void;
9
+ setCurrentScreen(screenName: string, options?: IAnalyticsCallOptions): void;
10
+ identify(userID: string, userPropertiesToSet?: UserProperties, userPropertiesToSetOnce?: UserProperties): void;
11
+ loggedOut(): void;
12
+ static ɵfac: i0.ɵɵFactoryDeclaration<FireAnalyticsService, never>;
13
+ static ɵprov: i0.ɵɵInjectableDeclaration<FireAnalyticsService>;
14
+ }
@@ -0,0 +1,9 @@
1
+ import { IAnalyticsCallOptions, IAnalyticsService, UserProperties } from '@sneat/core';
2
+ export declare class MultiAnalyticsService implements IAnalyticsService {
3
+ private readonly as;
4
+ constructor(as: readonly IAnalyticsService[]);
5
+ identify(userID: string, userPropsToSet?: UserProperties, userPropsToSetOnce?: UserProperties): void;
6
+ logEvent(eventName: string, eventParams?: Readonly<Record<string, unknown>>, options?: IAnalyticsCallOptions): void;
7
+ setCurrentScreen(screenName: string, options?: IAnalyticsCallOptions): void;
8
+ loggedOut(): void;
9
+ }
@@ -0,0 +1,11 @@
1
+ import { IAnalyticsService } from '@sneat/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare class PosthogAnalyticsService implements IAnalyticsService {
4
+ private errorLogger;
5
+ identify(userID: string): void;
6
+ logEvent(eventName: string, eventParams?: Readonly<Record<string, unknown>>): void;
7
+ setCurrentScreen(screenName: string): void;
8
+ loggedOut(): void;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<PosthogAnalyticsService, never>;
10
+ static ɵprov: i0.ɵɵInjectableDeclaration<PosthogAnalyticsService>;
11
+ }
@@ -0,0 +1,7 @@
1
+ import { IEnvironmentConfig } from '@sneat/core';
2
+ import { Provider } from '@angular/core';
3
+ export interface IAnalyticsConfig {
4
+ addPosthog?: boolean;
5
+ addFirebaseAnalytics?: boolean;
6
+ }
7
+ export declare function provideSneatAnalytics(environmentConfig: IEnvironmentConfig): Provider;
@@ -0,0 +1,12 @@
1
+ import { ToastController } from '@ionic/angular/standalone';
2
+ import { IErrorLogger, ILogErrorOptions } from '@sneat/core';
3
+ import * as i0 from "@angular/core";
4
+ export declare class ErrorLoggerService implements IErrorLogger {
5
+ private readonly toastController;
6
+ constructor(toastController: ToastController);
7
+ readonly logErrorHandler: (message?: string, options?: ILogErrorOptions) => (e: unknown) => void;
8
+ readonly logError: (e: unknown, message?: string, options?: ILogErrorOptions) => void;
9
+ showError(e: unknown, duration?: number): void;
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<ErrorLoggerService, [{ optional: true; }]>;
11
+ static ɵprov: i0.ɵɵInjectableDeclaration<ErrorLoggerService>;
12
+ }
@@ -0,0 +1,13 @@
1
+ import { ErrorHandler } from '@angular/core';
2
+ import { TraceService } from '@sentry/angular';
3
+ import { Router } from '@angular/router';
4
+ import { BrowserOptions } from '@sentry/browser';
5
+ export declare const provideSentryAppInitializer: (options: BrowserOptions) => ({
6
+ provide: typeof TraceService;
7
+ deps: (typeof Router)[];
8
+ useValue?: undefined;
9
+ } | {
10
+ provide: typeof ErrorHandler;
11
+ useValue: import("@sentry/angular").SentryErrorHandler;
12
+ deps?: undefined;
13
+ } | import("@angular/core").EnvironmentProviders)[];
@@ -0,0 +1,8 @@
1
+ import { Provider } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare function provideErrorLogger(): Provider;
4
+ export declare class SneatLoggingModule {
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<SneatLoggingModule, never>;
6
+ static ɵmod: i0.ɵɵNgModuleDeclaration<SneatLoggingModule, never, never, never>;
7
+ static ɵinj: i0.ɵɵInjectorDeclaration<SneatLoggingModule>;
8
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sneat/logging",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -14,5 +14,17 @@
14
14
  },
15
15
  "dependencies": {
16
16
  "tslib": "2.8.1"
17
- }
17
+ },
18
+ "module": "esm2022/sneat-logging.js",
19
+ "typings": "sneat-logging.d.ts",
20
+ "exports": {
21
+ "./package.json": {
22
+ "default": "./package.json"
23
+ },
24
+ ".": {
25
+ "types": "./sneat-logging.d.ts",
26
+ "default": "./esm2022/sneat-logging.js"
27
+ }
28
+ },
29
+ "sideEffects": false
18
30
  }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@sneat/logging" />
5
+ export * from './index';
package/eslint.config.js DELETED
@@ -1,7 +0,0 @@
1
- const baseConfig = require('../../eslint.config.js');
2
- const { sneatLibConfig } = require('../../eslint.lib.config.js');
3
-
4
- module.exports = [
5
- ...baseConfig,
6
- ...sneatLibConfig(__dirname),
7
- ];
package/ng-package.json DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
3
- "dest": "../../dist/libs/logging",
4
- "lib": {
5
- "entryFile": "src/index.ts"
6
- }
7
- }
package/project.json DELETED
@@ -1,38 +0,0 @@
1
- {
2
- "name": "logging",
3
- "$schema": "../../node_modules/nx/schemas/project-schema.json",
4
- "projectType": "library",
5
- "sourceRoot": "libs/logging/src",
6
- "prefix": "sneat",
7
- "targets": {
8
- "build": {
9
- "executor": "@nx/angular:ng-packagr-lite",
10
- "outputs": [
11
- "{workspaceRoot}/dist/libs/logging"
12
- ],
13
- "options": {
14
- "project": "libs/logging/ng-package.json",
15
- "tsConfig": "libs/logging/tsconfig.lib.json"
16
- },
17
- "configurations": {
18
- "production": {
19
- "tsConfig": "libs/logging/tsconfig.lib.prod.json"
20
- },
21
- "development": {}
22
- },
23
- "defaultConfiguration": "production"
24
- },
25
- "test": {
26
- "executor": "@nx/vitest:test",
27
- "outputs": [
28
- "{workspaceRoot}/coverage/libs/logging"
29
- ],
30
- "options": {
31
- "tsConfig": "libs/logging/tsconfig.spec.json"
32
- }
33
- },
34
- "lint": {
35
- "executor": "@nx/eslint:lint"
36
- }
37
- }
38
- }