diff --git a/frontend/package.json b/frontend/package.json index de875bdb3..4ecac7375 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -57,6 +57,7 @@ "ngx-stripe": "^19.0.0", "pluralize": "^8.0.0", "postgres-interval": "^4.0.2", + "posthog-js": "^1.341.0", "private-ip": "^3.0.2", "puppeteer": "^24.29.1", "rxjs": "^7.4.0", diff --git a/frontend/src/main.ts b/frontend/src/main.ts index d076afee3..55cd7f094 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -16,6 +16,7 @@ import { provideCharts, withDefaultRegisterables } from 'ng2-charts'; import { CookieService } from 'ngx-cookie-service'; import { MarkdownModule, provideMarkdown } from 'ngx-markdown'; import { NgxStripeModule } from 'ngx-stripe'; +import posthog from 'posthog-js'; import { AppComponent } from './app/app.component'; import { AppRoutingModule } from './app/app-routing.module'; import { ConfigModule } from './app/modules/config.module'; @@ -83,6 +84,11 @@ if ((environment as any).saas) { }); } +posthog.init('phc_VPnWHIMj9UjhRLPr7shATjgL0J4KrWWOHkK3JwZbnkw', { + api_host: 'https://us.i.posthog.com', + defaults: '2025-11-30', +}); + bootstrapApplication(AppComponent, { providers: [ importProvidersFrom( diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 8ffe1362c..7502ab602 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -3882,6 +3882,157 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/api-logs@npm:0.208.0, @opentelemetry/api-logs@npm:^0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/api-logs@npm:0.208.0" + dependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 98aa12c0c4a193714fe2b0f7a2d595cba3d87a6256e6291ed5768005af03885db9db5d74f2616532ecffc424b2ebf3ac87c6719d8fcb2d82b126736bfd1b6287 + languageName: node + linkType: hard + +"@opentelemetry/api@npm:^1.3.0, @opentelemetry/api@npm:^1.9.0": + version: 1.9.0 + resolution: "@opentelemetry/api@npm:1.9.0" + checksum: 9e88e59d53ced668f3daaecfd721071c5b85a67dd386f1c6f051d1be54375d850016c881f656ffbe9a03bedae85f7e89c2f2b635313f9c9b195ad033cdc31020 + languageName: node + linkType: hard + +"@opentelemetry/core@npm:2.2.0": + version: 2.2.0 + resolution: "@opentelemetry/core@npm:2.2.0" + dependencies: + "@opentelemetry/semantic-conventions": ^1.29.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: cfb75e67b91086ce47783b3ff30e4b0d3099630a6ead821c69dfc7c37925498e9e398d610ec5b87c2b5b86e17900dd8a5bb4a3d9dea6e122ed1add54efdcd149 + languageName: node + linkType: hard + +"@opentelemetry/core@npm:2.5.0": + version: 2.5.0 + resolution: "@opentelemetry/core@npm:2.5.0" + dependencies: + "@opentelemetry/semantic-conventions": ^1.29.0 + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: b609e923075b61b523aeba60ed91c9889cb6eda813bc635a1a7f62143f77ef41cf95f7f913d36dba4157a8ffafa1137644b460dbdee858466f563ca3198dc915 + languageName: node + linkType: hard + +"@opentelemetry/exporter-logs-otlp-http@npm:^0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/exporter-logs-otlp-http@npm:0.208.0" + dependencies: + "@opentelemetry/api-logs": 0.208.0 + "@opentelemetry/core": 2.2.0 + "@opentelemetry/otlp-exporter-base": 0.208.0 + "@opentelemetry/otlp-transformer": 0.208.0 + "@opentelemetry/sdk-logs": 0.208.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: fcb50fba5f5cc33acf4c11a6d2651583f5b7e02245602672ba0dad6852d19c3560b908266e67e36071104681459df1988fd68f8e4ae6e509a48d027509607cd4 + languageName: node + linkType: hard + +"@opentelemetry/otlp-exporter-base@npm:0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/otlp-exporter-base@npm:0.208.0" + dependencies: + "@opentelemetry/core": 2.2.0 + "@opentelemetry/otlp-transformer": 0.208.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: efb27b9fa5fd5fb9da19a0f4cb12d63f52e4965383d0af8bc21275cfa9cbff2df9aa42b2926f51396a2d0de73bfe1a36d1893251d3ce8b3417485312a2cda887 + languageName: node + linkType: hard + +"@opentelemetry/otlp-transformer@npm:0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/otlp-transformer@npm:0.208.0" + dependencies: + "@opentelemetry/api-logs": 0.208.0 + "@opentelemetry/core": 2.2.0 + "@opentelemetry/resources": 2.2.0 + "@opentelemetry/sdk-logs": 0.208.0 + "@opentelemetry/sdk-metrics": 2.2.0 + "@opentelemetry/sdk-trace-base": 2.2.0 + protobufjs: ^7.3.0 + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: b44cca4742213044aab316d003d0fa3c0c847c4c3605dfc0657c3620948d45b46e88e7b1b0d66ec1fa6c9e57c39957ab606b594d8d16a43e9987efb6bcdd30a6 + languageName: node + linkType: hard + +"@opentelemetry/resources@npm:2.2.0": + version: 2.2.0 + resolution: "@opentelemetry/resources@npm:2.2.0" + dependencies: + "@opentelemetry/core": 2.2.0 + "@opentelemetry/semantic-conventions": ^1.29.0 + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.10.0" + checksum: 437332f09f138577c0b2f4b15bbd63851083f19f8e30843ca50f16abf9012eedc32c5d86ed21305c40383dbc09b865dd2f399bf08f995c8cdcfe7472d29fd5c5 + languageName: node + linkType: hard + +"@opentelemetry/resources@npm:^2.2.0": + version: 2.5.0 + resolution: "@opentelemetry/resources@npm:2.5.0" + dependencies: + "@opentelemetry/core": 2.5.0 + "@opentelemetry/semantic-conventions": ^1.29.0 + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.10.0" + checksum: 313b2ba0be0c1f55c75441905d0f92c71f39af730bad35d9a37940a775b63743c124b67def9eb7f44aa17bd3fecc70482957f8ce2e2816fa11c25adf67fbfbe2 + languageName: node + linkType: hard + +"@opentelemetry/sdk-logs@npm:0.208.0, @opentelemetry/sdk-logs@npm:^0.208.0": + version: 0.208.0 + resolution: "@opentelemetry/sdk-logs@npm:0.208.0" + dependencies: + "@opentelemetry/api-logs": 0.208.0 + "@opentelemetry/core": 2.2.0 + "@opentelemetry/resources": 2.2.0 + peerDependencies: + "@opentelemetry/api": ">=1.4.0 <1.10.0" + checksum: 224476d2764f463f672b559650b606420e9351baae2c434c18e6353a03763f8b378543b6f72621cdffa8697daccfe5c9290084d589dad4c97c465b81ad9744b7 + languageName: node + linkType: hard + +"@opentelemetry/sdk-metrics@npm:2.2.0": + version: 2.2.0 + resolution: "@opentelemetry/sdk-metrics@npm:2.2.0" + dependencies: + "@opentelemetry/core": 2.2.0 + "@opentelemetry/resources": 2.2.0 + peerDependencies: + "@opentelemetry/api": ">=1.9.0 <1.10.0" + checksum: 9f389053d9e50d3773e05f1a0a64b97cd31dff456807af07d48c355a6b29a8eb0f131fa06e6e20d447434321b205747e40a47f3571ed1cc3550bf119834a06f3 + languageName: node + linkType: hard + +"@opentelemetry/sdk-trace-base@npm:2.2.0": + version: 2.2.0 + resolution: "@opentelemetry/sdk-trace-base@npm:2.2.0" + dependencies: + "@opentelemetry/core": 2.2.0 + "@opentelemetry/resources": 2.2.0 + "@opentelemetry/semantic-conventions": ^1.29.0 + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.10.0" + checksum: 3ea674ff6383644222cdc9e79bc7531ba5ba0c0134369bfb3159c0f761474828ef9b89db90c02f9d6b3c2e29e30784abc45ef631c6f1c612895171abc937c264 + languageName: node + linkType: hard + +"@opentelemetry/semantic-conventions@npm:^1.29.0": + version: 1.39.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.39.0" + checksum: 1e7c5241b2b088b0ab822471974188dfe01f635a0f798a2e8cd8b46a68f21e45ed7f385f222237e73117521d7041dfbce8bee01e8a8e59a69d00a4dc64494116 + languageName: node + linkType: hard + "@oxc-resolver/binding-android-arm-eabi@npm:11.17.0": version: 11.17.0 resolution: "@oxc-resolver/binding-android-arm-eabi@npm:11.17.0" @@ -4175,6 +4326,95 @@ __metadata: languageName: node linkType: hard +"@posthog/core@npm:1.20.0": + version: 1.20.0 + resolution: "@posthog/core@npm:1.20.0" + dependencies: + cross-spawn: ^7.0.6 + checksum: 66eb7f81d7e7dd50453ba67a11c43c98065b4339a66deaacfd656a80ed8efd30e0dbb63301d37f90c59430e89b62e6e125f6dbc111ae0f3c34b3ba74dafa68bb + languageName: node + linkType: hard + +"@posthog/types@npm:1.341.0": + version: 1.341.0 + resolution: "@posthog/types@npm:1.341.0" + checksum: 3f47bdbc63e6017584fba0bc7ded6c03d0b17a2c982df9b35502cf8e6207a4058d7c6de4939d4ae789e1f24ac28ed45cf17cad24da25a7342429cfc1df6149df + languageName: node + linkType: hard + +"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/aspromise@npm:1.1.2" + checksum: 011fe7ef0826b0fd1a95935a033a3c0fd08483903e1aa8f8b4e0704e3233406abb9ee25350ec0c20bbecb2aad8da0dcea58b392bbd77d6690736f02c143865d2 + languageName: node + linkType: hard + +"@protobufjs/base64@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/base64@npm:1.1.2" + checksum: 67173ac34de1e242c55da52c2f5bdc65505d82453893f9b51dc74af9fe4c065cf4a657a4538e91b0d4a1a1e0a0642215e31894c31650ff6e3831471061e1ee9e + languageName: node + linkType: hard + +"@protobufjs/codegen@npm:^2.0.4": + version: 2.0.4 + resolution: "@protobufjs/codegen@npm:2.0.4" + checksum: 59240c850b1d3d0b56d8f8098dd04787dcaec5c5bd8de186fa548de86b86076e1c50e80144b90335e705a044edf5bc8b0998548474c2a10a98c7e004a1547e4b + languageName: node + linkType: hard + +"@protobufjs/eventemitter@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/eventemitter@npm:1.1.0" + checksum: 0369163a3d226851682f855f81413cbf166cd98f131edb94a0f67f79e75342d86e89df9d7a1df08ac28be2bc77e0a7f0200526bb6c2a407abbfee1f0262d5fd7 + languageName: node + linkType: hard + +"@protobufjs/fetch@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/fetch@npm:1.1.0" + dependencies: + "@protobufjs/aspromise": ^1.1.1 + "@protobufjs/inquire": ^1.1.0 + checksum: 3fce7e09eb3f1171dd55a192066450f65324fd5f7cc01a431df01bb00d0a895e6bfb5b0c5561ce157ee1d886349c90703d10a4e11a1a256418ff591b969b3477 + languageName: node + linkType: hard + +"@protobufjs/float@npm:^1.0.2": + version: 1.0.2 + resolution: "@protobufjs/float@npm:1.0.2" + checksum: 5781e1241270b8bd1591d324ca9e3a3128d2f768077a446187a049e36505e91bc4156ed5ac3159c3ce3d2ba3743dbc757b051b2d723eea9cd367bfd54ab29b2f + languageName: node + linkType: hard + +"@protobufjs/inquire@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/inquire@npm:1.1.0" + checksum: ca06f02eaf65ca36fb7498fc3492b7fc087bfcc85c702bac5b86fad34b692bdce4990e0ef444c1e2aea8c034227bd1f0484be02810d5d7e931c55445555646f4 + languageName: node + linkType: hard + +"@protobufjs/path@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/path@npm:1.1.2" + checksum: 856eeb532b16a7aac071cacde5c5620df800db4c80cee6dbc56380524736205aae21e5ae47739114bf669ab5e8ba0e767a282ad894f3b5e124197cb9224445ee + languageName: node + linkType: hard + +"@protobufjs/pool@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/pool@npm:1.1.0" + checksum: d6a34fbbd24f729e2a10ee915b74e1d77d52214de626b921b2d77288bd8f2386808da2315080f2905761527cceffe7ec34c7647bd21a5ae41a25e8212ff79451 + languageName: node + linkType: hard + +"@protobufjs/utf8@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/utf8@npm:1.1.0" + checksum: f9bf3163d13aaa3b6f5e6fbf37a116e094ea021c0e1f2a7ccd0e12a29e2ce08dafba4e8b36e13f8ed7397e1591610ce880ed1289af4d66cf4ace8a36a9557278 + languageName: node + linkType: hard + "@puppeteer/browsers@npm:2.11.2": version: 2.11.2 resolution: "@puppeteer/browsers@npm:2.11.2" @@ -5274,7 +5514,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*": +"@types/node@npm:*, @types/node@npm:>=13.7.0": version: 25.2.0 resolution: "@types/node@npm:25.2.0" dependencies: @@ -6816,6 +7056,13 @@ __metadata: languageName: node linkType: hard +"core-js@npm:^3.38.1": + version: 3.48.0 + resolution: "core-js@npm:3.48.0" + checksum: e5ba89a2037b06827f198b7a39bf99eaf0ad696e27001b0137f17fcc4a7fce1ecaaa4ea7b3628709ee4cf6828130a2c53ec4bdf0064e1151d46965ca5a98733f + languageName: node + linkType: hard + "core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" @@ -6875,7 +7122,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.5": +"cross-spawn@npm:^7.0.5, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -7588,7 +7835,7 @@ __metadata: languageName: node linkType: hard -"dompurify@npm:^3.2.5": +"dompurify@npm:^3.2.5, dompurify@npm:^3.3.1": version: 3.3.1 resolution: "dompurify@npm:3.3.1" dependencies: @@ -8422,7 +8669,7 @@ __metadata: languageName: node linkType: hard -"fflate@npm:^0.4.4": +"fflate@npm:^0.4.4, fflate@npm:^0.4.8": version: 0.4.8 resolution: "fflate@npm:0.4.8" checksum: 29d8cbe44d5e7f53e7f5a160ac7f9cc025480c7b3bfd85c5f898cbe20dfa2dad4732daa534982664bf30b35896a90af44ea33ede5d94c5ffd1b8b0c0a0a56ca2 @@ -9767,6 +10014,13 @@ __metadata: languageName: node linkType: hard +"long@npm:^5.0.0": + version: 5.3.2 + resolution: "long@npm:5.3.2" + checksum: be215816b563f4ca27ad3677678b53415bc489f9e3466414e54d2d85f5f8e86768547fa58493bacfb363ffc57a664debc83403ccc2178aef0c40aca28bad47c9 + languageName: node + linkType: hard + "loupe@npm:^3.1.0, loupe@npm:^3.1.4": version: 3.2.1 resolution: "loupe@npm:3.2.1" @@ -11208,6 +11462,34 @@ __metadata: languageName: node linkType: hard +"posthog-js@npm:^1.341.0": + version: 1.341.0 + resolution: "posthog-js@npm:1.341.0" + dependencies: + "@opentelemetry/api": ^1.9.0 + "@opentelemetry/api-logs": ^0.208.0 + "@opentelemetry/exporter-logs-otlp-http": ^0.208.0 + "@opentelemetry/resources": ^2.2.0 + "@opentelemetry/sdk-logs": ^0.208.0 + "@posthog/core": 1.20.0 + "@posthog/types": 1.341.0 + core-js: ^3.38.1 + dompurify: ^3.3.1 + fflate: ^0.4.8 + preact: ^10.28.2 + query-selector-shadow-dom: ^1.0.1 + web-vitals: ^5.1.0 + checksum: 53b056a0657d64cf1ac0108b01e4fe8ac31ab927ae1e2fa16e31f134c592ba55f72693376ee1259874a6b0535b5ef4c245aa4d50885b9f28096f596fed971cc0 + languageName: node + linkType: hard + +"preact@npm:^10.28.2": + version: 10.28.3 + resolution: "preact@npm:10.28.3" + checksum: 8847b538127ff9f4dc86d7f3ffecd416137eaea868b559b9663a4c5a43bc1fcef77f8db41ee1fc55565bf339d9d951ffe90d11f3749726e6217315b3d658599a + languageName: node + linkType: hard + "pretty-format@npm:^27.0.2": version: 27.5.1 resolution: "pretty-format@npm:27.5.1" @@ -11276,6 +11558,26 @@ __metadata: languageName: node linkType: hard +"protobufjs@npm:^7.3.0": + version: 7.5.4 + resolution: "protobufjs@npm:7.5.4" + dependencies: + "@protobufjs/aspromise": ^1.1.2 + "@protobufjs/base64": ^1.1.2 + "@protobufjs/codegen": ^2.0.4 + "@protobufjs/eventemitter": ^1.1.0 + "@protobufjs/fetch": ^1.1.0 + "@protobufjs/float": ^1.0.2 + "@protobufjs/inquire": ^1.1.0 + "@protobufjs/path": ^1.1.2 + "@protobufjs/pool": ^1.1.0 + "@protobufjs/utf8": ^1.1.0 + "@types/node": ">=13.7.0" + long: ^5.0.0 + checksum: 53bf83b9a726b05d43da35bb990dba7536759787dccea9a67b8f31be9df470ba17f1f1b982ca19956cfc7726f3ec7e0e883ca4ad93b5ec753cc025a637fc704f + languageName: node + linkType: hard + "proxy-addr@npm:^2.0.7, proxy-addr@npm:~2.0.7": version: 2.0.7 resolution: "proxy-addr@npm:2.0.7" @@ -11373,6 +11675,13 @@ __metadata: languageName: node linkType: hard +"query-selector-shadow-dom@npm:^1.0.1": + version: 1.0.1 + resolution: "query-selector-shadow-dom@npm:1.0.1" + checksum: 8ab1cdd5e1927b583503b590165d66770fb91c87ac28b50a43596b755db3792c0e506250f46d0af97f0064a5cc12a1de449fd5c2cfcadf18b0880a4d8aecebbd + languageName: node + linkType: hard + "query-string@npm:8.1.0": version: 8.1.0 resolution: "query-string@npm:8.1.0" @@ -11735,6 +12044,7 @@ __metadata: playwright: ^1.57.0 pluralize: ^8.0.0 postgres-interval: ^4.0.2 + posthog-js: ^1.341.0 private-ip: ^3.0.2 puppeteer: ^24.29.1 rxjs: ^7.4.0 @@ -13529,6 +13839,13 @@ __metadata: languageName: node linkType: hard +"web-vitals@npm:^5.1.0": + version: 5.1.0 + resolution: "web-vitals@npm:5.1.0" + checksum: bd6a3186d9e7d7d3ab418ce67f3df81df1f7bbea88235ee092c47504966d1abc7e784ba27229f0a6ed919b8b8584defdc983d51aeb450dad5725b231e26bafb4 + languageName: node + linkType: hard + "webdriver-bidi-protocol@npm:0.4.0": version: 0.4.0 resolution: "webdriver-bidi-protocol@npm:0.4.0"