@sneat/logging 0.27.2 → 0.27.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.
- package/esm2022/lib/analytics/deferred-posthog-analytics.service.js +45 -0
- package/esm2022/lib/analytics/deferred-posthog-analytics.service.js.map +1 -0
- package/esm2022/lib/analytics/provide-sneat-analytics.js +2 -2
- package/esm2022/lib/analytics/provide-sneat-analytics.js.map +1 -1
- package/lib/analytics/deferred-posthog-analytics.service.d.ts +18 -0
- package/package.json +1 -1
- package/tsconfig.lib.prod.tsbuildinfo +1 -1
- package/esm2022/lib/analytics/posthog-analytics.service.js +0 -47
- package/esm2022/lib/analytics/posthog-analytics.service.js.map +0 -1
- package/lib/analytics/posthog-analytics.service.d.ts +0 -11
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loads PostHog only when there is an analytics event worth sending. The first
|
|
3
|
+
* operation is retained until the SDK is ready, so deferring the chunk never
|
|
4
|
+
* silently loses the sign-in or first page event.
|
|
5
|
+
*/
|
|
6
|
+
export class DeferredPosthogAnalyticsService {
|
|
7
|
+
constructor(settings, errorLogger) {
|
|
8
|
+
this.settings = settings;
|
|
9
|
+
this.errorLogger = errorLogger;
|
|
10
|
+
}
|
|
11
|
+
getClient() {
|
|
12
|
+
return (this.client ??= import('posthog-js')
|
|
13
|
+
.then(({ default: posthog }) => {
|
|
14
|
+
const client = posthog;
|
|
15
|
+
client.init(this.settings.token, {
|
|
16
|
+
...this.settings.config,
|
|
17
|
+
capture_pageview: false,
|
|
18
|
+
});
|
|
19
|
+
return client;
|
|
20
|
+
})
|
|
21
|
+
.catch((error) => {
|
|
22
|
+
this.client = undefined;
|
|
23
|
+
this.errorLogger.logError(error, 'Unable to start product analytics', {
|
|
24
|
+
show: false,
|
|
25
|
+
});
|
|
26
|
+
throw error;
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
send(action) {
|
|
30
|
+
void this.getClient().then(action).catch(() => undefined);
|
|
31
|
+
}
|
|
32
|
+
identify(userID, userPropsToSet, userPropsToSetOnce) {
|
|
33
|
+
this.send((client) => client.identify(userID, userPropsToSet, userPropsToSetOnce));
|
|
34
|
+
}
|
|
35
|
+
logEvent(eventName, eventParams, _options) {
|
|
36
|
+
this.send((client) => client.capture(eventName, eventParams));
|
|
37
|
+
}
|
|
38
|
+
setCurrentScreen(screenName, _options) {
|
|
39
|
+
this.send((client) => client.capture('$screen_view', { screen_name: screenName }));
|
|
40
|
+
}
|
|
41
|
+
loggedOut() {
|
|
42
|
+
this.send((client) => client.reset());
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=deferred-posthog-analytics.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deferred-posthog-analytics.service.js","sourceRoot":"","sources":["../../../../../../libs/logging/src/lib/analytics/deferred-posthog-analytics.service.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,MAAM,OAAO,+BAA+B;IAG1C,YACmB,QAA0B,EAC1B,WAAyB;QADzB,aAAQ,GAAR,QAAQ,CAAkB;QAC1B,gBAAW,GAAX,WAAW,CAAc;IACzC,CAAC;IAEI,SAAS;QACf,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,YAAY,CAAC;aACzC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,OAA6B,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;gBAC/B,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM;gBACvB,gBAAgB,EAAE,KAAK;aACxB,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,mCAAmC,EAAE;gBACpE,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC,CAAC;IACR,CAAC;IAEO,IAAI,CAAC,MAAiC;QAC5C,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;IAED,QAAQ,CACN,MAAc,EACd,cAA+B,EAC/B,kBAAmC;QAEnC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACnB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,kBAAkB,CAAC,CAC5D,CAAC;IACJ,CAAC;IAED,QAAQ,CACN,SAAiB,EACjB,WAA+C,EAC/C,QAAgC;QAEhC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,gBAAgB,CACd,UAAkB,EAClB,QAAgC;QAEhC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC;IAED,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;CACF","sourcesContent":["import {\n IAnalyticsCallOptions,\n IAnalyticsService,\n IErrorLogger,\n IPosthogSettings,\n UserProperties,\n} from '@sneat/core';\nimport type { PostHog } from 'posthog-js';\n\n/**\n * Loads PostHog only when there is an analytics event worth sending. The first\n * operation is retained until the SDK is ready, so deferring the chunk never\n * silently loses the sign-in or first page event.\n */\nexport class DeferredPosthogAnalyticsService implements IAnalyticsService {\n private client?: Promise<PostHog>;\n\n constructor(\n private readonly settings: IPosthogSettings,\n private readonly errorLogger: IErrorLogger,\n ) {}\n\n private getClient(): Promise<PostHog> {\n return (this.client ??= import('posthog-js')\n .then(({ default: posthog }) => {\n const client = posthog as unknown as PostHog;\n client.init(this.settings.token, {\n ...this.settings.config,\n capture_pageview: false,\n });\n return client;\n })\n .catch((error) => {\n this.client = undefined;\n this.errorLogger.logError(error, 'Unable to start product analytics', {\n show: false,\n });\n throw error;\n }));\n }\n\n private send(action: (client: PostHog) => void): void {\n void this.getClient().then(action).catch(() => undefined);\n }\n\n identify(\n userID: string,\n userPropsToSet?: UserProperties,\n userPropsToSetOnce?: UserProperties,\n ): void {\n this.send((client) =>\n client.identify(userID, userPropsToSet, userPropsToSetOnce),\n );\n }\n\n logEvent(\n eventName: string,\n eventParams?: Readonly<Record<string, unknown>>,\n _options?: IAnalyticsCallOptions,\n ): void {\n this.send((client) => client.capture(eventName, eventParams));\n }\n\n setCurrentScreen(\n screenName: string,\n _options?: IAnalyticsCallOptions,\n ): void {\n this.send((client) => client.capture('$screen_view', { screen_name: screenName }));\n }\n\n loggedOut(): void {\n this.send((client) => client.reset());\n }\n}\n"]}
|
|
@@ -3,7 +3,7 @@ import { ErrorLogger } from '@sneat/core';
|
|
|
3
3
|
import { FireAnalyticsService } from './fire-analytics.service';
|
|
4
4
|
import { GtagAnalyticsService } from './gtag-analytics.service';
|
|
5
5
|
import { MultiAnalyticsService } from './multi-analytics.service';
|
|
6
|
-
import {
|
|
6
|
+
import { DeferredPosthogAnalyticsService } from './deferred-posthog-analytics.service';
|
|
7
7
|
import { Injector } from '@angular/core';
|
|
8
8
|
function getAnalyticsConfig(environmentConfig) {
|
|
9
9
|
const useAnalytics = location.host === 'sneat.app' || location.protocol === 'https:';
|
|
@@ -31,7 +31,7 @@ export function provideSneatAnalytics(environmentConfig) {
|
|
|
31
31
|
const config = getAnalyticsConfig(environmentConfig);
|
|
32
32
|
const as = [];
|
|
33
33
|
if (config?.addPosthog) {
|
|
34
|
-
as.push(new
|
|
34
|
+
as.push(new DeferredPosthogAnalyticsService(environmentConfig.posthog, errorLogger));
|
|
35
35
|
}
|
|
36
36
|
if (config?.googleAnalyticsMeasurementId) {
|
|
37
37
|
as.push(new GtagAnalyticsService(config.googleAnalyticsMeasurementId));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provide-sneat-analytics.js","sourceRoot":"","sources":["../../../../../../libs/logging/src/lib/analytics/provide-sneat-analytics.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAGhB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"provide-sneat-analytics.js","sourceRoot":"","sources":["../../../../../../libs/logging/src/lib/analytics/provide-sneat-analytics.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAGhB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAY,MAAM,eAAe,CAAC;AAUnD,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;IAC9E,MAAM,eAAe,GAAG,iBAAiB,CAAC,eAAe,EAAE,aAAa,CAAC;IAEzE,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;QACjD,4BAA4B,EAAE,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;KACzE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,iBAAqC;IAErC,OAAO;QACL,OAAO,EAAE,gBAAgB;QACzB,0EAA0E;QAC1E,4EAA4E;QAC5E,yEAAyE;QACzE,4EAA4E;QAC5E,0EAA0E;QAC1E,iEAAiE;QACjE,IAAI,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;QAC7B,UAAU,EAAE,CAAC,WAAyB,EAAE,QAAkB,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,CACL,IAAI,+BAA+B,CACjC,iBAAiB,CAAC,OAEjB,EACD,WAAW,CACZ,CACF,CAAC;YACJ,CAAC;YACD,IAAI,MAAM,EAAE,4BAA4B,EAAE,CAAC;gBACzC,EAAE,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;YACzE,CAAC;YACD,IAAI,MAAM,EAAE,oBAAoB,EAAE,CAAC;gBACjC,MAAM,SAAS,GAAqB,QAAQ,CAAC,GAAG,CAC9C,wBAAwB,EACxB,IAAI,CACL,CAAC;gBACF,IAAI,SAAS,EAAE,CAAC;oBACd,0DAA0D;oBAC1D,8DAA8D;oBAC9D,0DAA0D;oBAC1D,EAAE,CAAC,IAAI,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;gBACtC,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 type { Analytics } from 'firebase/analytics';\nimport {\n AnalyticsService,\n IAnalyticsService,\n IEnvironmentConfig,\n SNEAT_FIREBASE_ANALYTICS,\n} from '@sneat/core';\nimport { ErrorLogger, IErrorLogger } from '@sneat/core';\nimport { FireAnalyticsService } from './fire-analytics.service';\nimport { GtagAnalyticsService } from './gtag-analytics.service';\nimport { MultiAnalyticsService } from './multi-analytics.service';\nimport { DeferredPosthogAnalyticsService } from './deferred-posthog-analytics.service';\nimport { Injector, Provider } from '@angular/core';\n\nexport interface IAnalyticsConfig {\n addPosthog?: boolean;\n addFirebaseAnalytics?: boolean;\n // GA4 measurement ID for the app's own per-domain property (the same stream\n // its marketing landing uses). When set, a gtag-based GA4 backend is added.\n googleAnalyticsMeasurementId?: string;\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 const gaMeasurementId = environmentConfig.googleAnalytics?.measurementId;\n\n return {\n addPosthog: useAnalytics && !!environmentConfig.posthog?.token,\n addFirebaseAnalytics:\n useAnalytics &&\n !!firebaseMeasurementId &&\n firebaseMeasurementId !== 'G-PROVIDE_IF_NEEDED',\n googleAnalyticsMeasurementId: useAnalytics ? gaMeasurementId : undefined,\n };\n}\n\nexport function provideSneatAnalytics(\n environmentConfig: IEnvironmentConfig,\n): Provider {\n return {\n provide: AnalyticsService,\n // `Injector` rather than `SNEAT_FIREBASE_ANALYTICS` directly: listing the\n // token in `deps` would resolve it — and so initialize Firebase Analytics —\n // on every app that injects `AnalyticsService`, including the ones where\n // `addFirebaseAnalytics` is false (plain http, non-sneat.app host). Reading\n // it through the injector inside the branch below keeps initialization as\n // lazy as the pre-0.27.0 `getAnalytics(fbApp)` call it replaces.\n deps: [ErrorLogger, Injector],\n useFactory: (errorLogger: IErrorLogger, injector: Injector) => {\n const config = getAnalyticsConfig(environmentConfig);\n const as: IAnalyticsService[] = [];\n if (config?.addPosthog) {\n as.push(\n new DeferredPosthogAnalyticsService(\n environmentConfig.posthog as NonNullable<\n IEnvironmentConfig['posthog']\n >,\n errorLogger,\n ),\n );\n }\n if (config?.googleAnalyticsMeasurementId) {\n as.push(new GtagAnalyticsService(config.googleAnalyticsMeasurementId));\n }\n if (config?.addFirebaseAnalytics) {\n const analytics: Analytics | null = injector.get(\n SNEAT_FIREBASE_ANALYTICS,\n null,\n );\n if (analytics) {\n // Constructed inside this factory's injection context, so\n // FireAnalyticsService's own inject(SNEAT_FIREBASE_ANALYTICS)\n // resolves — to this same, already-instantiated instance.\n as.push(new FireAnalyticsService());\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,18 @@
|
|
|
1
|
+
import { IAnalyticsCallOptions, IAnalyticsService, IErrorLogger, IPosthogSettings, UserProperties } from '@sneat/core';
|
|
2
|
+
/**
|
|
3
|
+
* Loads PostHog only when there is an analytics event worth sending. The first
|
|
4
|
+
* operation is retained until the SDK is ready, so deferring the chunk never
|
|
5
|
+
* silently loses the sign-in or first page event.
|
|
6
|
+
*/
|
|
7
|
+
export declare class DeferredPosthogAnalyticsService implements IAnalyticsService {
|
|
8
|
+
private readonly settings;
|
|
9
|
+
private readonly errorLogger;
|
|
10
|
+
private client?;
|
|
11
|
+
constructor(settings: IPosthogSettings, errorLogger: IErrorLogger);
|
|
12
|
+
private getClient;
|
|
13
|
+
private send;
|
|
14
|
+
identify(userID: string, userPropsToSet?: UserProperties, userPropsToSetOnce?: UserProperties): void;
|
|
15
|
+
logEvent(eventName: string, eventParams?: Readonly<Record<string, unknown>>, _options?: IAnalyticsCallOptions): void;
|
|
16
|
+
setCurrentScreen(screenName: string, _options?: IAnalyticsCallOptions): void;
|
|
17
|
+
loggedOut(): void;
|
|
18
|
+
}
|