@beesolve/analytics-processor 0.0.0 → 0.2.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/DOCS.md +20 -0
- package/README.md +87 -3
- package/dist/cdk.d.ts +49 -0
- package/dist/cdk.js +127 -0
- package/dist/dailyRollup/bowser-UJEXXM6S.mjs +2 -0
- package/dist/dailyRollup/bowser-UJEXXM6S.mjs.map +7 -0
- package/dist/dailyRollup/chunk-3GD7PA4I.mjs +2 -0
- package/dist/dailyRollup/chunk-3GD7PA4I.mjs.map +7 -0
- package/dist/dailyRollup/chunk-3YRRUMLY.mjs +10 -0
- package/dist/dailyRollup/chunk-3YRRUMLY.mjs.map +7 -0
- package/dist/dailyRollup/chunk-5JDAL5HL.mjs +2 -0
- package/dist/dailyRollup/chunk-5JDAL5HL.mjs.map +7 -0
- package/dist/dailyRollup/chunk-C4CD3R2M.mjs +2 -0
- package/dist/dailyRollup/chunk-C4CD3R2M.mjs.map +7 -0
- package/dist/dailyRollup/chunk-CFZ5JWD3.mjs +2 -0
- package/dist/dailyRollup/chunk-CFZ5JWD3.mjs.map +7 -0
- package/dist/dailyRollup/chunk-FLISSIFQ.mjs +4 -0
- package/dist/dailyRollup/chunk-FLISSIFQ.mjs.map +7 -0
- package/dist/dailyRollup/chunk-G7FCKJTE.mjs +8 -0
- package/dist/dailyRollup/chunk-G7FCKJTE.mjs.map +7 -0
- package/dist/dailyRollup/chunk-GHMUY3QB.mjs +13 -0
- package/dist/dailyRollup/chunk-GHMUY3QB.mjs.map +7 -0
- package/dist/dailyRollup/chunk-HGD7WY52.mjs +2 -0
- package/dist/dailyRollup/chunk-HGD7WY52.mjs.map +7 -0
- package/dist/dailyRollup/chunk-IHCR62UU.mjs +6 -0
- package/dist/dailyRollup/chunk-IHCR62UU.mjs.map +7 -0
- package/dist/dailyRollup/chunk-KT7DZL3D.mjs +2 -0
- package/dist/dailyRollup/chunk-KT7DZL3D.mjs.map +7 -0
- package/dist/dailyRollup/chunk-LK4IXOEA.mjs +2 -0
- package/dist/dailyRollup/chunk-LK4IXOEA.mjs.map +7 -0
- package/dist/dailyRollup/chunk-MATUPZWL.mjs +6 -0
- package/dist/dailyRollup/chunk-MATUPZWL.mjs.map +7 -0
- package/dist/dailyRollup/chunk-NX6AKUU3.mjs +2 -0
- package/dist/dailyRollup/chunk-NX6AKUU3.mjs.map +7 -0
- package/dist/dailyRollup/chunk-PBJCPHYW.mjs +10 -0
- package/dist/dailyRollup/chunk-PBJCPHYW.mjs.map +7 -0
- package/dist/dailyRollup/chunk-PNUYSX4A.mjs +2 -0
- package/dist/dailyRollup/chunk-PNUYSX4A.mjs.map +7 -0
- package/dist/dailyRollup/chunk-RO44VKXZ.mjs +2 -0
- package/dist/dailyRollup/chunk-RO44VKXZ.mjs.map +7 -0
- package/dist/dailyRollup/chunk-RU3KGSS6.mjs +2 -0
- package/dist/dailyRollup/chunk-RU3KGSS6.mjs.map +7 -0
- package/dist/dailyRollup/chunk-VG37NXBO.mjs +2 -0
- package/dist/dailyRollup/chunk-VG37NXBO.mjs.map +7 -0
- package/dist/dailyRollup/chunk-VVG5B2RA.mjs +13 -0
- package/dist/dailyRollup/chunk-VVG5B2RA.mjs.map +7 -0
- package/dist/dailyRollup/chunk-YIZKQ2WK.mjs +10 -0
- package/dist/dailyRollup/chunk-YIZKQ2WK.mjs.map +7 -0
- package/dist/dailyRollup/chunk-ZH5DZOB5.mjs +2 -0
- package/dist/dailyRollup/chunk-ZH5DZOB5.mjs.map +7 -0
- package/dist/dailyRollup/client-7VYWT6KE.mjs +2 -0
- package/dist/dailyRollup/client-7VYWT6KE.mjs.map +7 -0
- package/dist/dailyRollup/dailyRollup.mjs +2 -0
- package/dist/dailyRollup/dailyRollup.mjs.map +7 -0
- package/dist/dailyRollup/dist-es-3PO6WBRA.mjs +2 -0
- package/dist/dailyRollup/dist-es-3PO6WBRA.mjs.map +7 -0
- package/dist/dailyRollup/dist-es-4375P743.mjs +2 -0
- package/dist/dailyRollup/dist-es-4375P743.mjs.map +7 -0
- package/dist/dailyRollup/dist-es-43J27JDM.mjs +3 -0
- package/dist/dailyRollup/dist-es-43J27JDM.mjs.map +7 -0
- package/dist/dailyRollup/dist-es-6SRW3I3T.mjs +2 -0
- package/dist/dailyRollup/dist-es-6SRW3I3T.mjs.map +7 -0
- package/dist/dailyRollup/dist-es-BMGNYEV6.mjs +3 -0
- package/dist/dailyRollup/dist-es-BMGNYEV6.mjs.map +7 -0
- package/dist/dailyRollup/dist-es-BQ5OLCIJ.mjs +2 -0
- package/dist/dailyRollup/dist-es-BQ5OLCIJ.mjs.map +7 -0
- package/dist/dailyRollup/dist-es-CFDT5MDO.mjs +2 -0
- package/dist/dailyRollup/dist-es-CFDT5MDO.mjs.map +7 -0
- package/dist/dailyRollup/dist-es-FPBJ7DAB.mjs +2 -0
- package/dist/dailyRollup/dist-es-FPBJ7DAB.mjs.map +7 -0
- package/dist/dailyRollup/dist-es-G4DL2UUB.mjs +7 -0
- package/dist/dailyRollup/dist-es-G4DL2UUB.mjs.map +7 -0
- package/dist/dailyRollup/dist-es-IRYFH3EH.mjs +2 -0
- package/dist/dailyRollup/dist-es-IRYFH3EH.mjs.map +7 -0
- package/dist/dailyRollup/dist-es-L5F6PNYU.mjs +2 -0
- package/dist/dailyRollup/dist-es-L5F6PNYU.mjs.map +7 -0
- package/dist/dailyRollup/dist-es-LEKBJS4E.mjs +2 -0
- package/dist/dailyRollup/dist-es-LEKBJS4E.mjs.map +7 -0
- package/dist/dailyRollup/dist-es-NMUDTELL.mjs +2 -0
- package/dist/dailyRollup/dist-es-NMUDTELL.mjs.map +7 -0
- package/dist/dailyRollup/dist-es-OY2VA72W.mjs +2 -0
- package/dist/dailyRollup/dist-es-OY2VA72W.mjs.map +7 -0
- package/dist/dailyRollup/dist-es-SJKDRHZJ.mjs +2 -0
- package/dist/dailyRollup/dist-es-SJKDRHZJ.mjs.map +7 -0
- package/dist/dailyRollup/dist-es-UGFAGDM2.mjs +7 -0
- package/dist/dailyRollup/dist-es-UGFAGDM2.mjs.map +7 -0
- package/dist/dailyRollup/dist-es-YRXTT57X.mjs +3 -0
- package/dist/dailyRollup/dist-es-YRXTT57X.mjs.map +7 -0
- package/dist/dailyRollup/event-streams-G2EZD32F.mjs +2 -0
- package/dist/dailyRollup/event-streams-G2EZD32F.mjs.map +7 -0
- package/dist/dailyRollup/event-streams-H4LI66VS.mjs +2 -0
- package/dist/dailyRollup/event-streams-H4LI66VS.mjs.map +7 -0
- package/dist/dailyRollup/event-streams-U52YN65T.mjs +2 -0
- package/dist/dailyRollup/event-streams-U52YN65T.mjs.map +7 -0
- package/dist/dailyRollup/loadCognitoIdentity-3OXED256.mjs +2 -0
- package/dist/dailyRollup/loadCognitoIdentity-3OXED256.mjs.map +7 -0
- package/dist/dailyRollup/loadSso-6KWTKR23.mjs +2 -0
- package/dist/dailyRollup/loadSso-6KWTKR23.mjs.map +7 -0
- package/dist/dailyRollup/loadSso-AITTIS6M.mjs +2 -0
- package/dist/dailyRollup/loadSso-AITTIS6M.mjs.map +7 -0
- package/dist/dailyRollup/loadSts-LQCNCE76.mjs +2 -0
- package/dist/dailyRollup/loadSts-LQCNCE76.mjs.map +7 -0
- package/dist/dailyRollup/signin-THWW5VM5.mjs +2 -0
- package/dist/dailyRollup/signin-THWW5VM5.mjs.map +7 -0
- package/dist/dailyRollup/signin-ZKLDJEMJ.mjs +2 -0
- package/dist/dailyRollup/signin-ZKLDJEMJ.mjs.map +7 -0
- package/dist/dailyRollup/sso-oidc-MI4NLGSV.mjs +2 -0
- package/dist/dailyRollup/sso-oidc-MI4NLGSV.mjs.map +7 -0
- package/dist/dailyRollup/sso-oidc-OWLWHDBI.mjs +2 -0
- package/dist/dailyRollup/sso-oidc-OWLWHDBI.mjs.map +7 -0
- package/dist/dailyRollup/sts-AQIPDWOX.mjs +2 -0
- package/dist/dailyRollup/sts-AQIPDWOX.mjs.map +7 -0
- package/dist/dailyRollup/sts-EN7K54DW.mjs +2 -0
- package/dist/dailyRollup/sts-EN7K54DW.mjs.map +7 -0
- package/dist/hourly/bowser-UJEXXM6S.mjs +2 -0
- package/dist/hourly/bowser-UJEXXM6S.mjs.map +7 -0
- package/dist/hourly/chunk-2LV65MUY.mjs +2 -0
- package/dist/hourly/chunk-2LV65MUY.mjs.map +7 -0
- package/dist/hourly/chunk-3GD7PA4I.mjs +2 -0
- package/dist/hourly/chunk-3GD7PA4I.mjs.map +7 -0
- package/dist/hourly/chunk-4X6M4ZIM.mjs +13 -0
- package/dist/hourly/chunk-4X6M4ZIM.mjs.map +7 -0
- package/dist/hourly/chunk-5EEREEGM.mjs +10 -0
- package/dist/hourly/chunk-5EEREEGM.mjs.map +7 -0
- package/dist/hourly/chunk-5JDAL5HL.mjs +2 -0
- package/dist/hourly/chunk-5JDAL5HL.mjs.map +7 -0
- package/dist/hourly/chunk-C4CD3R2M.mjs +2 -0
- package/dist/hourly/chunk-C4CD3R2M.mjs.map +7 -0
- package/dist/hourly/chunk-CDK2TDZ3.mjs +2 -0
- package/dist/hourly/chunk-CDK2TDZ3.mjs.map +7 -0
- package/dist/hourly/chunk-CFZ5JWD3.mjs +2 -0
- package/dist/hourly/chunk-CFZ5JWD3.mjs.map +7 -0
- package/dist/hourly/chunk-DDOSB7QU.mjs +10 -0
- package/dist/hourly/chunk-DDOSB7QU.mjs.map +7 -0
- package/dist/hourly/chunk-FLISSIFQ.mjs +4 -0
- package/dist/hourly/chunk-FLISSIFQ.mjs.map +7 -0
- package/dist/hourly/chunk-G7FCKJTE.mjs +8 -0
- package/dist/hourly/chunk-G7FCKJTE.mjs.map +7 -0
- package/dist/hourly/chunk-HGD7WY52.mjs +2 -0
- package/dist/hourly/chunk-HGD7WY52.mjs.map +7 -0
- package/dist/hourly/chunk-IHCR62UU.mjs +6 -0
- package/dist/hourly/chunk-IHCR62UU.mjs.map +7 -0
- package/dist/hourly/chunk-LK4IXOEA.mjs +2 -0
- package/dist/hourly/chunk-LK4IXOEA.mjs.map +7 -0
- package/dist/hourly/chunk-MATUPZWL.mjs +6 -0
- package/dist/hourly/chunk-MATUPZWL.mjs.map +7 -0
- package/dist/hourly/chunk-NX6AKUU3.mjs +2 -0
- package/dist/hourly/chunk-NX6AKUU3.mjs.map +7 -0
- package/dist/hourly/chunk-OV75J3RB.mjs +10 -0
- package/dist/hourly/chunk-OV75J3RB.mjs.map +7 -0
- package/dist/hourly/chunk-RO44VKXZ.mjs +2 -0
- package/dist/hourly/chunk-RO44VKXZ.mjs.map +7 -0
- package/dist/hourly/chunk-RU3KGSS6.mjs +2 -0
- package/dist/hourly/chunk-RU3KGSS6.mjs.map +7 -0
- package/dist/hourly/chunk-SEATMW6H.mjs +2 -0
- package/dist/hourly/chunk-SEATMW6H.mjs.map +7 -0
- package/dist/hourly/chunk-UEL4UF23.mjs +2 -0
- package/dist/hourly/chunk-UEL4UF23.mjs.map +7 -0
- package/dist/hourly/chunk-VG37NXBO.mjs +2 -0
- package/dist/hourly/chunk-VG37NXBO.mjs.map +7 -0
- package/dist/hourly/chunk-YLTURKBY.mjs +13 -0
- package/dist/hourly/chunk-YLTURKBY.mjs.map +7 -0
- package/dist/hourly/chunk-ZH5DZOB5.mjs +2 -0
- package/dist/hourly/chunk-ZH5DZOB5.mjs.map +7 -0
- package/dist/hourly/client-YFAS5DGU.mjs +2 -0
- package/dist/hourly/client-YFAS5DGU.mjs.map +7 -0
- package/dist/hourly/dist-es-2QGRGQLF.mjs +7 -0
- package/dist/hourly/dist-es-2QGRGQLF.mjs.map +7 -0
- package/dist/hourly/dist-es-4JJUYAKR.mjs +2 -0
- package/dist/hourly/dist-es-4JJUYAKR.mjs.map +7 -0
- package/dist/hourly/dist-es-4NUPISR6.mjs +3 -0
- package/dist/hourly/dist-es-4NUPISR6.mjs.map +7 -0
- package/dist/hourly/dist-es-4PFASTED.mjs +2 -0
- package/dist/hourly/dist-es-4PFASTED.mjs.map +7 -0
- package/dist/hourly/dist-es-ARVZEK2B.mjs +2 -0
- package/dist/hourly/dist-es-ARVZEK2B.mjs.map +7 -0
- package/dist/hourly/dist-es-BH4D2XQ2.mjs +2 -0
- package/dist/hourly/dist-es-BH4D2XQ2.mjs.map +7 -0
- package/dist/hourly/dist-es-D46ET7B3.mjs +2 -0
- package/dist/hourly/dist-es-D46ET7B3.mjs.map +7 -0
- package/dist/hourly/dist-es-DQHOM6HA.mjs +3 -0
- package/dist/hourly/dist-es-DQHOM6HA.mjs.map +7 -0
- package/dist/hourly/dist-es-ETNPEJSC.mjs +2 -0
- package/dist/hourly/dist-es-ETNPEJSC.mjs.map +7 -0
- package/dist/hourly/dist-es-HCGEEOBW.mjs +2 -0
- package/dist/hourly/dist-es-HCGEEOBW.mjs.map +7 -0
- package/dist/hourly/dist-es-LONCZIHI.mjs +2 -0
- package/dist/hourly/dist-es-LONCZIHI.mjs.map +7 -0
- package/dist/hourly/dist-es-PV5J6DAM.mjs +2 -0
- package/dist/hourly/dist-es-PV5J6DAM.mjs.map +7 -0
- package/dist/hourly/dist-es-S4EGUNEL.mjs +2 -0
- package/dist/hourly/dist-es-S4EGUNEL.mjs.map +7 -0
- package/dist/hourly/dist-es-VDZMHJW2.mjs +7 -0
- package/dist/hourly/dist-es-VDZMHJW2.mjs.map +7 -0
- package/dist/hourly/dist-es-WBVL2T3J.mjs +2 -0
- package/dist/hourly/dist-es-WBVL2T3J.mjs.map +7 -0
- package/dist/hourly/dist-es-YFKUCAP2.mjs +2 -0
- package/dist/hourly/dist-es-YFKUCAP2.mjs.map +7 -0
- package/dist/hourly/dist-es-YZBMXOS5.mjs +3 -0
- package/dist/hourly/dist-es-YZBMXOS5.mjs.map +7 -0
- package/dist/hourly/event-streams-G2EZD32F.mjs +2 -0
- package/dist/hourly/event-streams-G2EZD32F.mjs.map +7 -0
- package/dist/hourly/event-streams-H4LI66VS.mjs +2 -0
- package/dist/hourly/event-streams-H4LI66VS.mjs.map +7 -0
- package/dist/hourly/event-streams-U52YN65T.mjs +2 -0
- package/dist/hourly/event-streams-U52YN65T.mjs.map +7 -0
- package/dist/hourly/hourly.mjs +11 -0
- package/dist/hourly/hourly.mjs.map +7 -0
- package/dist/hourly/loadCognitoIdentity-KHSY4IOA.mjs +2 -0
- package/dist/hourly/loadCognitoIdentity-KHSY4IOA.mjs.map +7 -0
- package/dist/hourly/loadSso-HHJP34KX.mjs +2 -0
- package/dist/hourly/loadSso-HHJP34KX.mjs.map +7 -0
- package/dist/hourly/loadSso-R47RBCPJ.mjs +2 -0
- package/dist/hourly/loadSso-R47RBCPJ.mjs.map +7 -0
- package/dist/hourly/loadSts-5X55AJY5.mjs +2 -0
- package/dist/hourly/loadSts-5X55AJY5.mjs.map +7 -0
- package/dist/hourly/signin-F7JF6BF6.mjs +2 -0
- package/dist/hourly/signin-F7JF6BF6.mjs.map +7 -0
- package/dist/hourly/signin-WDXS6SW2.mjs +2 -0
- package/dist/hourly/signin-WDXS6SW2.mjs.map +7 -0
- package/dist/hourly/sso-oidc-63EGB35D.mjs +2 -0
- package/dist/hourly/sso-oidc-63EGB35D.mjs.map +7 -0
- package/dist/hourly/sso-oidc-UVLJZI2R.mjs +2 -0
- package/dist/hourly/sso-oidc-UVLJZI2R.mjs.map +7 -0
- package/dist/hourly/sts-4M7S3GN4.mjs +2 -0
- package/dist/hourly/sts-4M7S3GN4.mjs.map +7 -0
- package/dist/hourly/sts-YXUOYWFS.mjs +2 -0
- package/dist/hourly/sts-YXUOYWFS.mjs.map +7 -0
- package/dist/index.d.ts +359 -0
- package/dist/index.js +1011 -0
- package/dist/monthlyRollup/bowser-UJEXXM6S.mjs +2 -0
- package/dist/monthlyRollup/bowser-UJEXXM6S.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-3GD7PA4I.mjs +2 -0
- package/dist/monthlyRollup/chunk-3GD7PA4I.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-3YRRUMLY.mjs +10 -0
- package/dist/monthlyRollup/chunk-3YRRUMLY.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-5JDAL5HL.mjs +2 -0
- package/dist/monthlyRollup/chunk-5JDAL5HL.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-C4CD3R2M.mjs +2 -0
- package/dist/monthlyRollup/chunk-C4CD3R2M.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-CFZ5JWD3.mjs +2 -0
- package/dist/monthlyRollup/chunk-CFZ5JWD3.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-FLISSIFQ.mjs +4 -0
- package/dist/monthlyRollup/chunk-FLISSIFQ.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-G7FCKJTE.mjs +8 -0
- package/dist/monthlyRollup/chunk-G7FCKJTE.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-GHMUY3QB.mjs +13 -0
- package/dist/monthlyRollup/chunk-GHMUY3QB.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-HGD7WY52.mjs +2 -0
- package/dist/monthlyRollup/chunk-HGD7WY52.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-IHCR62UU.mjs +6 -0
- package/dist/monthlyRollup/chunk-IHCR62UU.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-KT7DZL3D.mjs +2 -0
- package/dist/monthlyRollup/chunk-KT7DZL3D.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-LK4IXOEA.mjs +2 -0
- package/dist/monthlyRollup/chunk-LK4IXOEA.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-MATUPZWL.mjs +6 -0
- package/dist/monthlyRollup/chunk-MATUPZWL.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-NX6AKUU3.mjs +2 -0
- package/dist/monthlyRollup/chunk-NX6AKUU3.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-PBJCPHYW.mjs +10 -0
- package/dist/monthlyRollup/chunk-PBJCPHYW.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-PNUYSX4A.mjs +2 -0
- package/dist/monthlyRollup/chunk-PNUYSX4A.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-RO44VKXZ.mjs +2 -0
- package/dist/monthlyRollup/chunk-RO44VKXZ.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-RU3KGSS6.mjs +2 -0
- package/dist/monthlyRollup/chunk-RU3KGSS6.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-VG37NXBO.mjs +2 -0
- package/dist/monthlyRollup/chunk-VG37NXBO.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-VVG5B2RA.mjs +13 -0
- package/dist/monthlyRollup/chunk-VVG5B2RA.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-YIZKQ2WK.mjs +10 -0
- package/dist/monthlyRollup/chunk-YIZKQ2WK.mjs.map +7 -0
- package/dist/monthlyRollup/chunk-ZH5DZOB5.mjs +2 -0
- package/dist/monthlyRollup/chunk-ZH5DZOB5.mjs.map +7 -0
- package/dist/monthlyRollup/client-7VYWT6KE.mjs +2 -0
- package/dist/monthlyRollup/client-7VYWT6KE.mjs.map +7 -0
- package/dist/monthlyRollup/dist-es-3PO6WBRA.mjs +2 -0
- package/dist/monthlyRollup/dist-es-3PO6WBRA.mjs.map +7 -0
- package/dist/monthlyRollup/dist-es-4375P743.mjs +2 -0
- package/dist/monthlyRollup/dist-es-4375P743.mjs.map +7 -0
- package/dist/monthlyRollup/dist-es-43J27JDM.mjs +3 -0
- package/dist/monthlyRollup/dist-es-43J27JDM.mjs.map +7 -0
- package/dist/monthlyRollup/dist-es-6SRW3I3T.mjs +2 -0
- package/dist/monthlyRollup/dist-es-6SRW3I3T.mjs.map +7 -0
- package/dist/monthlyRollup/dist-es-BMGNYEV6.mjs +3 -0
- package/dist/monthlyRollup/dist-es-BMGNYEV6.mjs.map +7 -0
- package/dist/monthlyRollup/dist-es-BQ5OLCIJ.mjs +2 -0
- package/dist/monthlyRollup/dist-es-BQ5OLCIJ.mjs.map +7 -0
- package/dist/monthlyRollup/dist-es-CFDT5MDO.mjs +2 -0
- package/dist/monthlyRollup/dist-es-CFDT5MDO.mjs.map +7 -0
- package/dist/monthlyRollup/dist-es-FPBJ7DAB.mjs +2 -0
- package/dist/monthlyRollup/dist-es-FPBJ7DAB.mjs.map +7 -0
- package/dist/monthlyRollup/dist-es-G4DL2UUB.mjs +7 -0
- package/dist/monthlyRollup/dist-es-G4DL2UUB.mjs.map +7 -0
- package/dist/monthlyRollup/dist-es-IRYFH3EH.mjs +2 -0
- package/dist/monthlyRollup/dist-es-IRYFH3EH.mjs.map +7 -0
- package/dist/monthlyRollup/dist-es-L5F6PNYU.mjs +2 -0
- package/dist/monthlyRollup/dist-es-L5F6PNYU.mjs.map +7 -0
- package/dist/monthlyRollup/dist-es-LEKBJS4E.mjs +2 -0
- package/dist/monthlyRollup/dist-es-LEKBJS4E.mjs.map +7 -0
- package/dist/monthlyRollup/dist-es-NMUDTELL.mjs +2 -0
- package/dist/monthlyRollup/dist-es-NMUDTELL.mjs.map +7 -0
- package/dist/monthlyRollup/dist-es-OY2VA72W.mjs +2 -0
- package/dist/monthlyRollup/dist-es-OY2VA72W.mjs.map +7 -0
- package/dist/monthlyRollup/dist-es-SJKDRHZJ.mjs +2 -0
- package/dist/monthlyRollup/dist-es-SJKDRHZJ.mjs.map +7 -0
- package/dist/monthlyRollup/dist-es-UGFAGDM2.mjs +7 -0
- package/dist/monthlyRollup/dist-es-UGFAGDM2.mjs.map +7 -0
- package/dist/monthlyRollup/dist-es-YRXTT57X.mjs +3 -0
- package/dist/monthlyRollup/dist-es-YRXTT57X.mjs.map +7 -0
- package/dist/monthlyRollup/event-streams-G2EZD32F.mjs +2 -0
- package/dist/monthlyRollup/event-streams-G2EZD32F.mjs.map +7 -0
- package/dist/monthlyRollup/event-streams-H4LI66VS.mjs +2 -0
- package/dist/monthlyRollup/event-streams-H4LI66VS.mjs.map +7 -0
- package/dist/monthlyRollup/event-streams-U52YN65T.mjs +2 -0
- package/dist/monthlyRollup/event-streams-U52YN65T.mjs.map +7 -0
- package/dist/monthlyRollup/loadCognitoIdentity-3OXED256.mjs +2 -0
- package/dist/monthlyRollup/loadCognitoIdentity-3OXED256.mjs.map +7 -0
- package/dist/monthlyRollup/loadSso-6KWTKR23.mjs +2 -0
- package/dist/monthlyRollup/loadSso-6KWTKR23.mjs.map +7 -0
- package/dist/monthlyRollup/loadSso-AITTIS6M.mjs +2 -0
- package/dist/monthlyRollup/loadSso-AITTIS6M.mjs.map +7 -0
- package/dist/monthlyRollup/loadSts-LQCNCE76.mjs +2 -0
- package/dist/monthlyRollup/loadSts-LQCNCE76.mjs.map +7 -0
- package/dist/monthlyRollup/monthlyRollup.mjs +2 -0
- package/dist/monthlyRollup/monthlyRollup.mjs.map +7 -0
- package/dist/monthlyRollup/signin-THWW5VM5.mjs +2 -0
- package/dist/monthlyRollup/signin-THWW5VM5.mjs.map +7 -0
- package/dist/monthlyRollup/signin-ZKLDJEMJ.mjs +2 -0
- package/dist/monthlyRollup/signin-ZKLDJEMJ.mjs.map +7 -0
- package/dist/monthlyRollup/sso-oidc-MI4NLGSV.mjs +2 -0
- package/dist/monthlyRollup/sso-oidc-MI4NLGSV.mjs.map +7 -0
- package/dist/monthlyRollup/sso-oidc-OWLWHDBI.mjs +2 -0
- package/dist/monthlyRollup/sso-oidc-OWLWHDBI.mjs.map +7 -0
- package/dist/monthlyRollup/sts-AQIPDWOX.mjs +2 -0
- package/dist/monthlyRollup/sts-AQIPDWOX.mjs.map +7 -0
- package/dist/monthlyRollup/sts-EN7K54DW.mjs +2 -0
- package/dist/monthlyRollup/sts-EN7K54DW.mjs.map +7 -0
- package/package.json +55 -6
package/DOCS.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# @beesolve/analytics-processor - Documentation
|
|
2
|
+
|
|
3
|
+
**Keywords:** CloudFront analytics, Athena, DynamoDB totals, breakdowns, rollups, AnalyticsProcessor construct, grantRead, processHour, hourKey, windowKeys, Grain, Dimension, backfill
|
|
4
|
+
|
|
5
|
+
> This documentation is published inside the installed package and matches the installed version. Prefer it over prior knowledge or older examples found online.
|
|
6
|
+
|
|
7
|
+
> Full source and ADRs: https://github.com/BeeSolve/packages/tree/main/packages/analytics-processor
|
|
8
|
+
|
|
9
|
+
This package does not ship how-to guides. See the [README](./README.md) for the API
|
|
10
|
+
reference and usage, and the GitHub repository for source and examples.
|
|
11
|
+
|
|
12
|
+
## How-To Guides
|
|
13
|
+
|
|
14
|
+
- [Reduce Athena cost](./docs/how-to/reduce-athena-cost.md) - deliver only the 10 fields
|
|
15
|
+
the processor needs via the exported `requiredRecordFields`
|
|
16
|
+
|
|
17
|
+
## Further Reading
|
|
18
|
+
|
|
19
|
+
- [README](./README.md) - API reference and usage
|
|
20
|
+
- [CHANGELOG](./CHANGELOG.md) - Version history
|
package/README.md
CHANGED
|
@@ -1,4 +1,88 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @beesolve/analytics-processor
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
CloudFront analytics processor. Reads CloudFront standard-logs via Athena and
|
|
4
|
+
maintains a single-table DynamoDB design of hourly totals, per-dimension
|
|
5
|
+
breakdowns, and daily/monthly rollups using atomic counter updates with
|
|
6
|
+
per-period idempotency markers.
|
|
7
|
+
|
|
8
|
+
## Architecture
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
┌──────────────┐ hourly ┌────────┐ ADD + marker ┌──────────┐
|
|
12
|
+
│ CloudFront │ ──────────► │ Athena │ ───────────────► │ DynamoDB │
|
|
13
|
+
│ v2 Parquet │ query │ │ (transaction) │ totals │
|
|
14
|
+
│ (S3 + Glue) │ └────────┘ │ breakdowns│
|
|
15
|
+
└──────────────┘ └──────────┘
|
|
16
|
+
▲
|
|
17
|
+
daily / monthly rollups (read-back) ─────┘
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
An hourly Lambda runs exactly one partition-pruned Athena query over a closed
|
|
21
|
+
hour of v2 Parquet data and writes totals + per-dimension breakdowns with
|
|
22
|
+
atomic `ADD` updates, guarded by a per-hour `applied#...` marker written
|
|
23
|
+
conditionally in the same `TransactWriteCommand`. Daily and monthly rollup
|
|
24
|
+
Lambdas sum finer-grain DynamoDB items (never re-querying Athena). A one-time
|
|
25
|
+
standalone backfill script walks historic v1 data through the same write path.
|
|
26
|
+
|
|
27
|
+
## Installation
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm install @beesolve/analytics-processor
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Exports
|
|
34
|
+
|
|
35
|
+
- `.` — schemas/types (`totalsSchema`/`TotalsItem`, `breakdownSchema`/`BreakdownItem`,
|
|
36
|
+
`appliedMarkerSchema`/`AppliedMarker`, `grains`/`Grain`, `dimensions`/`Dimension`),
|
|
37
|
+
time/window helpers (`hourKey`, `dayKey`, `monthKey`, `maxWindowFor`,
|
|
38
|
+
`windowKeys`, `shiftAnchor`, `hoursBetween`), model classes (`Totals`,
|
|
39
|
+
`Breakdowns`, `AppliedMarkers`, `IpInfoCache` + `lookupIpInfo` + `IpInfo`/`IpInfoCacheItem`),
|
|
40
|
+
pure helpers (`buildHourlyQuery`, `classifyDevice`, `sumTotals`,
|
|
41
|
+
`sumBreakdown`, `topNWithOther`), and `processHour` (+ `applyDailyRollup`/`applyMonthlyRollup`).
|
|
42
|
+
- `./cdk` — the `AnalyticsProcessor` CDK construct.
|
|
43
|
+
|
|
44
|
+
Lambda handlers and the backfill script are not part of the public API.
|
|
45
|
+
|
|
46
|
+
## CDK Usage
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
import { AnalyticsProcessor } from "@beesolve/analytics-processor/cdk";
|
|
50
|
+
|
|
51
|
+
const processor = new AnalyticsProcessor(this, "Analytics", {
|
|
52
|
+
athenaDatabase: logging.glueDatabaseName,
|
|
53
|
+
athenaV2Table: logging.glueTableName,
|
|
54
|
+
athenaWorkgroup: logging.workgroupName,
|
|
55
|
+
logBucketArn: logging.logBucket.bucketArn,
|
|
56
|
+
athenaResultsBucketArn: logging.athenaResultsBucket.bucketArn,
|
|
57
|
+
ipInfoApiKey: process.env.IPINFO_API_KEY,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Grant read-only access to a dashboard Lambda. Sets ANALYTICS_TABLE_NAME and
|
|
61
|
+
// ANALYTICS_REVERSE_INDEX env vars on the handler.
|
|
62
|
+
processor.grantRead(dashboardLambda);
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The construct provisions:
|
|
66
|
+
|
|
67
|
+
- DynamoDB table (on-demand, composite key `pk`/`sk`, reverse GSI `reverse`, TTL)
|
|
68
|
+
- Three Lambdas (Node.js 24): `Hourly`, `DailyRollup`, `MonthlyRollup`
|
|
69
|
+
- EventBridge schedules: hourly `rate(1 hour)`, daily cron (`00:15`), monthly cron (`01:30` on the 1st)
|
|
70
|
+
- Least-privilege Athena/Glue/S3 access for the hourly Lambda
|
|
71
|
+
|
|
72
|
+
## Backfill
|
|
73
|
+
|
|
74
|
+
The one-time backfill script walks historic v1 log data through the same write
|
|
75
|
+
path as the hourly Lambda. It is resumable and exactly-once via the idempotency
|
|
76
|
+
markers — already-applied hours skip instantly.
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
TABLE_NAME=... \
|
|
80
|
+
ATHENA_DATABASE=... ATHENA_V1_TABLE=... ATHENA_WORKGROUP=... \
|
|
81
|
+
bun run backfill -- --from 2026-01-01T00:00:00Z --to 2026-01-31T23:00:00Z --concurrency 2 --rollups
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
- `--from` / `--to` — inclusive ISO hour range (required).
|
|
85
|
+
- `--concurrency` — bounded parallelism (default 2).
|
|
86
|
+
- `--rollups` — after the per-hour fill, run daily and monthly rollups over the range.
|
|
87
|
+
|
|
88
|
+
Credentials are resolved by the default AWS SDK chain (honors `AWS_PROFILE`).
|
package/dist/cdk.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { RemovalPolicy } from "aws-cdk-lib";
|
|
2
|
+
import { TableV2 } from "aws-cdk-lib/aws-dynamodb";
|
|
3
|
+
import { Function as LambdaFunction, FunctionOptions } from "aws-cdk-lib/aws-lambda";
|
|
4
|
+
import { Construct } from "constructs";
|
|
5
|
+
interface AnalyticsProcessorProps {
|
|
6
|
+
readonly athenaDatabase: string;
|
|
7
|
+
readonly athenaV2Table: string;
|
|
8
|
+
readonly athenaV1Table?: string;
|
|
9
|
+
readonly athenaWorkgroup: string;
|
|
10
|
+
readonly athenaOutputLocation?: string;
|
|
11
|
+
readonly logBucketArn: string;
|
|
12
|
+
readonly athenaResultsBucketArn?: string;
|
|
13
|
+
readonly ipInfoApiKey?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Number of top paths retained per period before the rest collapse into a
|
|
16
|
+
* single `__other__` bucket.
|
|
17
|
+
* @default 100
|
|
18
|
+
*/
|
|
19
|
+
readonly topPaths?: number;
|
|
20
|
+
/**
|
|
21
|
+
* TTL in days for hourly totals, breakdowns, and markers.
|
|
22
|
+
* @default 90
|
|
23
|
+
*/
|
|
24
|
+
readonly hourlyTtlDays?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Hours to lag the hourly schedule behind wall-clock so v2 delivery has
|
|
27
|
+
* settled before an hour is processed.
|
|
28
|
+
* @default 2
|
|
29
|
+
*/
|
|
30
|
+
readonly processingLagHours?: number;
|
|
31
|
+
/**
|
|
32
|
+
* DynamoDB table removal policy.
|
|
33
|
+
* @default RemovalPolicy.RETAIN
|
|
34
|
+
*/
|
|
35
|
+
readonly removalPolicy?: RemovalPolicy;
|
|
36
|
+
/**
|
|
37
|
+
* Override Lambda function properties (memorySize, timeout) for the three
|
|
38
|
+
* processing functions.
|
|
39
|
+
* @default {memorySize: 256, timeout: Duration.minutes(5)}
|
|
40
|
+
*/
|
|
41
|
+
readonly processorProps?: Pick<FunctionOptions, "memorySize" | "timeout">;
|
|
42
|
+
}
|
|
43
|
+
declare class AnalyticsProcessor extends Construct {
|
|
44
|
+
readonly table: TableV2;
|
|
45
|
+
readonly reverseIndexName = "reverse";
|
|
46
|
+
constructor(scope: Construct, id: string, props: AnalyticsProcessorProps);
|
|
47
|
+
grantRead(handler: LambdaFunction): void;
|
|
48
|
+
}
|
|
49
|
+
export { AnalyticsProcessor, AnalyticsProcessorProps };
|
package/dist/cdk.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// packages/analytics-processor/cdk.ts
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { Nodejs24Function } from "@beesolve/cdk-constructs";
|
|
4
|
+
import { Duration, RemovalPolicy } from "aws-cdk-lib";
|
|
5
|
+
import { AttributeType, Billing, ProjectionType, TableV2 } from "aws-cdk-lib/aws-dynamodb";
|
|
6
|
+
import { Rule, Schedule } from "aws-cdk-lib/aws-events";
|
|
7
|
+
import { LambdaFunction as LambdaFunctionTarget } from "aws-cdk-lib/aws-events-targets";
|
|
8
|
+
import { Effect, PolicyStatement } from "aws-cdk-lib/aws-iam";
|
|
9
|
+
import { Construct } from "constructs";
|
|
10
|
+
var defaultTopPaths = 100;
|
|
11
|
+
var defaultHourlyTtlDays = 90;
|
|
12
|
+
var defaultProcessingLagHours = 2;
|
|
13
|
+
|
|
14
|
+
class AnalyticsProcessor extends Construct {
|
|
15
|
+
table;
|
|
16
|
+
reverseIndexName = "reverse";
|
|
17
|
+
constructor(scope, id, props) {
|
|
18
|
+
super(scope, id);
|
|
19
|
+
const topPaths = props.topPaths ?? defaultTopPaths;
|
|
20
|
+
const hourlyTtlDays = props.hourlyTtlDays ?? defaultHourlyTtlDays;
|
|
21
|
+
const processingLagHours = props.processingLagHours ?? defaultProcessingLagHours;
|
|
22
|
+
const memorySize = props.processorProps?.memorySize ?? 256;
|
|
23
|
+
const timeout = props.processorProps?.timeout ?? Duration.minutes(5);
|
|
24
|
+
this.table = new TableV2(this, "Table", {
|
|
25
|
+
partitionKey: { name: "pk", type: AttributeType.STRING },
|
|
26
|
+
sortKey: { name: "sk", type: AttributeType.STRING },
|
|
27
|
+
billing: Billing.onDemand(),
|
|
28
|
+
removalPolicy: props.removalPolicy ?? RemovalPolicy.RETAIN,
|
|
29
|
+
timeToLiveAttribute: "ttl"
|
|
30
|
+
});
|
|
31
|
+
this.table.addGlobalSecondaryIndex({
|
|
32
|
+
indexName: this.reverseIndexName,
|
|
33
|
+
partitionKey: { name: "sk", type: AttributeType.STRING },
|
|
34
|
+
sortKey: { name: "pk", type: AttributeType.STRING },
|
|
35
|
+
projectionType: ProjectionType.ALL
|
|
36
|
+
});
|
|
37
|
+
const sharedEnvironment = {
|
|
38
|
+
TABLE_NAME: this.table.tableName,
|
|
39
|
+
REVERSE_INDEX_NAME: this.reverseIndexName,
|
|
40
|
+
HOURLY_TTL_DAYS: hourlyTtlDays.toString(),
|
|
41
|
+
TOP_PATHS: topPaths.toString(),
|
|
42
|
+
PROCESSING_LAG_HOURS: processingLagHours.toString()
|
|
43
|
+
};
|
|
44
|
+
const builtDir = fileURLToPath(new URL(".", import.meta.url));
|
|
45
|
+
const hourly = new Nodejs24Function(this, "Hourly", {
|
|
46
|
+
description: "CloudFront analytics hourly processor — Athena query to DynamoDB totals",
|
|
47
|
+
entry: `${builtDir}hourly/`,
|
|
48
|
+
handler: "hourly.handler",
|
|
49
|
+
memorySize,
|
|
50
|
+
timeout,
|
|
51
|
+
environment: {
|
|
52
|
+
...sharedEnvironment,
|
|
53
|
+
ATHENA_DATABASE: props.athenaDatabase,
|
|
54
|
+
ATHENA_V2_TABLE: props.athenaV2Table,
|
|
55
|
+
ATHENA_WORKGROUP: props.athenaWorkgroup,
|
|
56
|
+
...props.athenaOutputLocation != null ? { ATHENA_OUTPUT_LOCATION: props.athenaOutputLocation } : {},
|
|
57
|
+
...props.ipInfoApiKey != null ? { IPINFO_API_KEY: props.ipInfoApiKey } : {}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
this.table.grantReadWriteData(hourly);
|
|
61
|
+
hourly.addToRolePolicy(new PolicyStatement({
|
|
62
|
+
effect: Effect.ALLOW,
|
|
63
|
+
actions: [
|
|
64
|
+
"athena:StartQueryExecution",
|
|
65
|
+
"athena:GetQueryExecution",
|
|
66
|
+
"athena:GetQueryResults",
|
|
67
|
+
"athena:StopQueryExecution"
|
|
68
|
+
],
|
|
69
|
+
resources: ["*"]
|
|
70
|
+
}));
|
|
71
|
+
hourly.addToRolePolicy(new PolicyStatement({
|
|
72
|
+
effect: Effect.ALLOW,
|
|
73
|
+
actions: ["glue:GetTable", "glue:GetDatabase", "glue:GetPartitions"],
|
|
74
|
+
resources: ["*"]
|
|
75
|
+
}));
|
|
76
|
+
hourly.addToRolePolicy(new PolicyStatement({
|
|
77
|
+
effect: Effect.ALLOW,
|
|
78
|
+
actions: ["s3:GetObject", "s3:ListBucket", "s3:GetBucketLocation"],
|
|
79
|
+
resources: [props.logBucketArn, `${props.logBucketArn}/*`]
|
|
80
|
+
}));
|
|
81
|
+
if (props.athenaResultsBucketArn != null) {
|
|
82
|
+
hourly.addToRolePolicy(new PolicyStatement({
|
|
83
|
+
effect: Effect.ALLOW,
|
|
84
|
+
actions: ["s3:PutObject", "s3:GetObject"],
|
|
85
|
+
resources: [props.athenaResultsBucketArn, `${props.athenaResultsBucketArn}/*`]
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
const dailyRollup = new Nodejs24Function(this, "DailyRollup", {
|
|
89
|
+
description: "CloudFront analytics daily rollup — sums hourly DynamoDB items",
|
|
90
|
+
entry: `${builtDir}dailyRollup/`,
|
|
91
|
+
handler: "dailyRollup.handler",
|
|
92
|
+
memorySize,
|
|
93
|
+
timeout,
|
|
94
|
+
environment: sharedEnvironment
|
|
95
|
+
});
|
|
96
|
+
this.table.grantReadWriteData(dailyRollup);
|
|
97
|
+
const monthlyRollup = new Nodejs24Function(this, "MonthlyRollup", {
|
|
98
|
+
description: "CloudFront analytics monthly rollup — sums daily DynamoDB items",
|
|
99
|
+
entry: `${builtDir}monthlyRollup/`,
|
|
100
|
+
handler: "monthlyRollup.handler",
|
|
101
|
+
memorySize,
|
|
102
|
+
timeout,
|
|
103
|
+
environment: sharedEnvironment
|
|
104
|
+
});
|
|
105
|
+
this.table.grantReadWriteData(monthlyRollup);
|
|
106
|
+
new Rule(this, "HourlySchedule", {
|
|
107
|
+
schedule: Schedule.rate(Duration.hours(1)),
|
|
108
|
+
targets: [new LambdaFunctionTarget(hourly)]
|
|
109
|
+
});
|
|
110
|
+
new Rule(this, "DailyRollupSchedule", {
|
|
111
|
+
schedule: Schedule.cron({ minute: "15", hour: "0" }),
|
|
112
|
+
targets: [new LambdaFunctionTarget(dailyRollup)]
|
|
113
|
+
});
|
|
114
|
+
new Rule(this, "MonthlyRollupSchedule", {
|
|
115
|
+
schedule: Schedule.cron({ minute: "30", hour: "1", day: "1" }),
|
|
116
|
+
targets: [new LambdaFunctionTarget(monthlyRollup)]
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
grantRead(handler) {
|
|
120
|
+
this.table.grantReadData(handler);
|
|
121
|
+
handler.addEnvironment("ANALYTICS_TABLE_NAME", this.table.tableName);
|
|
122
|
+
handler.addEnvironment("ANALYTICS_REVERSE_INDEX", this.reverseIndexName);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
export {
|
|
126
|
+
AnalyticsProcessor
|
|
127
|
+
};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/* CommonJS polyfills */import { fileURLToPath } from 'node:url';import { createRequire } from 'node:module';const __filename = fileURLToPath(import.meta.url);const __dirname = fileURLToPath(new URL('.', import.meta.url));const require = createRequire(import.meta.url);/* end of CommonJS polyfills */
|
|
2
|
+
import{a as f}from"./chunk-CFZ5JWD3.mjs";var F={AmazonBot:"amazonbot","Amazon Silk":"amazon_silk","Android Browser":"android",BaiduSpider:"baiduspider",Bada:"bada",BingCrawler:"bingcrawler",Brave:"brave",BlackBerry:"blackberry","ChatGPT-User":"chatgpt_user",Chrome:"chrome",ClaudeBot:"claudebot",Chromium:"chromium",Diffbot:"diffbot",DuckDuckBot:"duckduckbot",DuckDuckGo:"duckduckgo",Electron:"electron",Epiphany:"epiphany",FacebookExternalHit:"facebookexternalhit",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot",GPTBot:"gptbot","Internet Explorer":"ie",InternetArchiveCrawler:"internetarchivecrawler","K-Meleon":"k_meleon",LibreWolf:"librewolf",Linespider:"linespider",Maxthon:"maxthon","Meta-ExternalAds":"meta_externalads","Meta-ExternalAgent":"meta_externalagent","Meta-ExternalFetcher":"meta_externalfetcher","Meta-WebIndexer":"meta_webindexer","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver","OAI-SearchBot":"oai_searchbot",Omgilibot:"omgilibot",Opera:"opera","Opera Coast":"opera_coast","Pale Moon":"pale_moon",PerplexityBot:"perplexitybot","Perplexity-User":"perplexity_user",PhantomJS:"phantomjs",PingdomBot:"pingdombot",Puffin:"puffin",QQ:"qq",QQLite:"qqlite",QupZilla:"qupzilla",Roku:"roku",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SlackBot:"slackbot",SeaMonkey:"seamonkey",Sleipnir:"sleipnir","Sogou Browser":"sogou",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat",YahooSlurp:"yahooslurp","Yandex Browser":"yandex",YandexBot:"yandexbot",YouBot:"youbot"},p={amazonbot:"AmazonBot",amazon_silk:"Amazon Silk",android:"Android Browser",baiduspider:"BaiduSpider",bada:"Bada",bingcrawler:"BingCrawler",blackberry:"BlackBerry",brave:"Brave",chatgpt_user:"ChatGPT-User",chrome:"Chrome",claudebot:"ClaudeBot",chromium:"Chromium",diffbot:"Diffbot",duckduckbot:"DuckDuckBot",duckduckgo:"DuckDuckGo",edge:"Microsoft Edge",electron:"Electron",epiphany:"Epiphany",facebookexternalhit:"FacebookExternalHit",firefox:"Firefox",focus:"Focus",generic:"Generic",google_search:"Google Search",googlebot:"Googlebot",gptbot:"GPTBot",ie:"Internet Explorer",internetarchivecrawler:"InternetArchiveCrawler",k_meleon:"K-Meleon",librewolf:"LibreWolf",linespider:"Linespider",maxthon:"Maxthon",meta_externalads:"Meta-ExternalAds",meta_externalagent:"Meta-ExternalAgent",meta_externalfetcher:"Meta-ExternalFetcher",meta_webindexer:"Meta-WebIndexer",mz:"MZ Browser",naver:"NAVER Whale Browser",oai_searchbot:"OAI-SearchBot",omgilibot:"Omgilibot",opera:"Opera",opera_coast:"Opera Coast",pale_moon:"Pale Moon",perplexitybot:"PerplexityBot",perplexity_user:"Perplexity-User",phantomjs:"PhantomJS",pingdombot:"PingdomBot",puffin:"Puffin",qq:"QQ Browser",qqlite:"QQ Browser Lite",qupzilla:"QupZilla",roku:"Roku",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",slackbot:"SlackBot",sleipnir:"Sleipnir",sogou:"Sogou Browser",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yahooslurp:"YahooSlurp",yandex:"Yandex Browser",yandexbot:"YandexBot",youbot:"YouBot"},o={bot:"bot",desktop:"desktop",mobile:"mobile",tablet:"tablet",tv:"tv"},b={Android:"Android",Bada:"Bada",BlackBerry:"BlackBerry",ChromeOS:"Chrome OS",HarmonyOS:"HarmonyOS",iOS:"iOS",Linux:"Linux",MacOS:"macOS",PlayStation4:"PlayStation 4",Roku:"Roku",Tizen:"Tizen",WebOS:"WebOS",Windows:"Windows",WindowsPhone:"Windows Phone"},m={Blink:"Blink",EdgeHTML:"EdgeHTML",Gecko:"Gecko",Presto:"Presto",Trident:"Trident",WebKit:"WebKit"};var s=class r{static{f(this,"Utils")}static getFirstMatch(e,t){let i=t.match(e);return i&&i.length>0&&i[1]||""}static getSecondMatch(e,t){let i=t.match(e);return i&&i.length>1&&i[2]||""}static matchAndReturnConst(e,t,i){if(e.test(t))return i}static getWindowsVersionName(e){switch(e){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}}static getMacOSVersionName(e){let t=e.split(".").splice(0,2).map(c=>parseInt(c,10)||0);t.push(0);let i=t[0],a=t[1];if(i===10)switch(a){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}switch(i){case 11:return"Big Sur";case 12:return"Monterey";case 13:return"Ventura";case 14:return"Sonoma";case 15:return"Sequoia";default:return}}static getAndroidVersionName(e){let t=e.split(".").splice(0,2).map(i=>parseInt(i,10)||0);if(t.push(0),!(t[0]===1&&t[1]<5)){if(t[0]===1&&t[1]<6)return"Cupcake";if(t[0]===1&&t[1]>=6)return"Donut";if(t[0]===2&&t[1]<2)return"Eclair";if(t[0]===2&&t[1]===2)return"Froyo";if(t[0]===2&&t[1]>2)return"Gingerbread";if(t[0]===3)return"Honeycomb";if(t[0]===4&&t[1]<1)return"Ice Cream Sandwich";if(t[0]===4&&t[1]<4)return"Jelly Bean";if(t[0]===4&&t[1]>=4)return"KitKat";if(t[0]===5)return"Lollipop";if(t[0]===6)return"Marshmallow";if(t[0]===7)return"Nougat";if(t[0]===8)return"Oreo";if(t[0]===9)return"Pie"}}static getVersionPrecision(e){return e.split(".").length}static compareVersions(e,t,i=!1){let a=r.getVersionPrecision(e),c=r.getVersionPrecision(t),u=Math.max(a,c),l=0,d=r.map([e,t],g=>{let h=u-r.getVersionPrecision(g),A=g+new Array(h+1).join(".0");return r.map(A.split("."),y=>new Array(20-y.length).join("0")+y).reverse()});for(i&&(l=u-Math.min(a,c)),u-=1;u>=l;){if(d[0][u]>d[1][u])return 1;if(d[0][u]===d[1][u]){if(u===l)return 0;u-=1}else if(d[0][u]<d[1][u])return-1}}static map(e,t){let i=[],a;if(Array.prototype.map)return Array.prototype.map.call(e,t);for(a=0;a<e.length;a+=1)i.push(t(e[a]));return i}static find(e,t){let i,a;if(Array.prototype.find)return Array.prototype.find.call(e,t);for(i=0,a=e.length;i<a;i+=1){let c=e[i];if(t(c,i))return c}}static assign(e,...t){let i=e,a,c;if(Object.assign)return Object.assign(e,...t);for(a=0,c=t.length;a<c;a+=1){let u=t[a];typeof u=="object"&&u!==null&&Object.keys(u).forEach(d=>{i[d]=u[d]})}return e}static getBrowserAlias(e){return F[e]}static getBrowserTypeByAlias(e){return p[e]||""}};var n=/version\/(\d+(\.?_?\d+)+)/i,P=[{test:[/gptbot/i],describe(r){let e={name:"GPTBot"},t=s.getFirstMatch(/gptbot\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/chatgpt-user/i],describe(r){let e={name:"ChatGPT-User"},t=s.getFirstMatch(/chatgpt-user\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/oai-searchbot/i],describe(r){let e={name:"OAI-SearchBot"},t=s.getFirstMatch(/oai-searchbot\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/claudebot/i,/claude-web/i,/claude-user/i,/claude-searchbot/i],describe(r){let e={name:"ClaudeBot"},t=s.getFirstMatch(/(?:claudebot|claude-web|claude-user|claude-searchbot)\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/omgilibot/i,/webzio-extended/i],describe(r){let e={name:"Omgilibot"},t=s.getFirstMatch(/(?:omgilibot|webzio-extended)\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/diffbot/i],describe(r){let e={name:"Diffbot"},t=s.getFirstMatch(/diffbot\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/perplexitybot/i],describe(r){let e={name:"PerplexityBot"},t=s.getFirstMatch(/perplexitybot\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/perplexity-user/i],describe(r){let e={name:"Perplexity-User"},t=s.getFirstMatch(/perplexity-user\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/youbot/i],describe(r){let e={name:"YouBot"},t=s.getFirstMatch(/youbot\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/meta-webindexer/i],describe(r){let e={name:"Meta-WebIndexer"},t=s.getFirstMatch(/meta-webindexer\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/meta-externalads/i],describe(r){let e={name:"Meta-ExternalAds"},t=s.getFirstMatch(/meta-externalads\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/meta-externalagent/i],describe(r){let e={name:"Meta-ExternalAgent"},t=s.getFirstMatch(/meta-externalagent\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/meta-externalfetcher/i],describe(r){let e={name:"Meta-ExternalFetcher"},t=s.getFirstMatch(/meta-externalfetcher\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/googlebot/i],describe(r){let e={name:"Googlebot"},t=s.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/linespider/i],describe(r){let e={name:"Linespider"},t=s.getFirstMatch(/(?:linespider)(?:-[-\w]+)?[\s/](\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/amazonbot/i],describe(r){let e={name:"AmazonBot"},t=s.getFirstMatch(/amazonbot\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/bingbot/i],describe(r){let e={name:"BingCrawler"},t=s.getFirstMatch(/bingbot\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/baiduspider/i],describe(r){let e={name:"BaiduSpider"},t=s.getFirstMatch(/baiduspider\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/duckduckbot/i],describe(r){let e={name:"DuckDuckBot"},t=s.getFirstMatch(/duckduckbot\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/ia_archiver/i],describe(r){let e={name:"InternetArchiveCrawler"},t=s.getFirstMatch(/ia_archiver\/(\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/facebookexternalhit/i,/facebookcatalog/i],describe(){return{name:"FacebookExternalHit"}}},{test:[/slackbot/i,/slack-imgProxy/i],describe(r){let e={name:"SlackBot"},t=s.getFirstMatch(/(?:slackbot|slack-imgproxy)(?:-[-\w]+)?[\s/](\d+(\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/yahoo!?[\s/]*slurp/i],describe(){return{name:"YahooSlurp"}}},{test:[/yandexbot/i,/yandexmobilebot/i],describe(){return{name:"YandexBot"}}},{test:[/pingdom/i],describe(){return{name:"PingdomBot"}}},{test:[/opera/i],describe(r){let e={name:"Opera"},t=s.getFirstMatch(n,r)||s.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/opr\/|opios/i],describe(r){let e={name:"Opera"},t=s.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/SamsungBrowser/i],describe(r){let e={name:"Samsung Internet for Android"},t=s.getFirstMatch(n,r)||s.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/Whale/i],describe(r){let e={name:"NAVER Whale Browser"},t=s.getFirstMatch(n,r)||s.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/PaleMoon/i],describe(r){let e={name:"Pale Moon"},t=s.getFirstMatch(n,r)||s.getFirstMatch(/(?:PaleMoon)[\s/](\d+(?:\.\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/MZBrowser/i],describe(r){let e={name:"MZ Browser"},t=s.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/focus/i],describe(r){let e={name:"Focus"},t=s.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/swing/i],describe(r){let e={name:"Swing"},t=s.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/coast/i],describe(r){let e={name:"Opera Coast"},t=s.getFirstMatch(n,r)||s.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe(r){let e={name:"Opera Touch"},t=s.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/yabrowser/i],describe(r){let e={name:"Yandex Browser"},t=s.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/ucbrowser/i],describe(r){let e={name:"UC Browser"},t=s.getFirstMatch(n,r)||s.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/Maxthon|mxios/i],describe(r){let e={name:"Maxthon"},t=s.getFirstMatch(n,r)||s.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/epiphany/i],describe(r){let e={name:"Epiphany"},t=s.getFirstMatch(n,r)||s.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/puffin/i],describe(r){let e={name:"Puffin"},t=s.getFirstMatch(n,r)||s.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/sleipnir/i],describe(r){let e={name:"Sleipnir"},t=s.getFirstMatch(n,r)||s.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/k-meleon/i],describe(r){let e={name:"K-Meleon"},t=s.getFirstMatch(n,r)||s.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/micromessenger/i],describe(r){let e={name:"WeChat"},t=s.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/qqbrowser/i],describe(r){let e={name:/qqbrowserlite/i.test(r)?"QQ Browser Lite":"QQ Browser"},t=s.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/msie|trident/i],describe(r){let e={name:"Internet Explorer"},t=s.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/\sedg\//i],describe(r){let e={name:"Microsoft Edge"},t=s.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/edg([ea]|ios)/i],describe(r){let e={name:"Microsoft Edge"},t=s.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/vivaldi/i],describe(r){let e={name:"Vivaldi"},t=s.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/seamonkey/i],describe(r){let e={name:"SeaMonkey"},t=s.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/sailfish/i],describe(r){let e={name:"Sailfish"},t=s.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,r);return t&&(e.version=t),e}},{test:[/silk/i],describe(r){let e={name:"Amazon Silk"},t=s.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/phantom/i],describe(r){let e={name:"PhantomJS"},t=s.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/slimerjs/i],describe(r){let e={name:"SlimerJS"},t=s.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(r){let e={name:"BlackBerry"},t=s.getFirstMatch(n,r)||s.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/(web|hpw)[o0]s/i],describe(r){let e={name:"WebOS Browser"},t=s.getFirstMatch(n,r)||s.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/bada/i],describe(r){let e={name:"Bada"},t=s.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/tizen/i],describe(r){let e={name:"Tizen"},t=s.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/qupzilla/i],describe(r){let e={name:"QupZilla"},t=s.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/librewolf/i],describe(r){let e={name:"LibreWolf"},t=s.getFirstMatch(/(?:librewolf)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/firefox|iceweasel|fxios/i],describe(r){let e={name:"Firefox"},t=s.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/electron/i],describe(r){let e={name:"Electron"},t=s.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/sogoumobilebrowser/i,/metasr/i,/se 2\.[x]/i],describe(r){let e={name:"Sogou Browser"},t=s.getFirstMatch(/(?:sogoumobilebrowser)[\s/](\d+(\.?_?\d+)+)/i,r),i=s.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,r),a=s.getFirstMatch(/se ([\d.]+)x/i,r),c=t||i||a;return c&&(e.version=c),e}},{test:[/MiuiBrowser/i],describe(r){let e={name:"Miui"},t=s.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test(r){return r.hasBrand("DuckDuckGo")?!0:r.test(/\sDdg\/[\d.]+$/i)},describe(r,e){let t={name:"DuckDuckGo"};if(e){let a=e.getBrandVersion("DuckDuckGo");if(a)return t.version=a,t}let i=s.getFirstMatch(/\sDdg\/([\d.]+)$/i,r);return i&&(t.version=i),t}},{test(r){return r.hasBrand("Brave")},describe(r,e){let t={name:"Brave"};if(e){let i=e.getBrandVersion("Brave");if(i)return t.version=i,t}return t}},{test:[/chromium/i],describe(r){let e={name:"Chromium"},t=s.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,r)||s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/chrome|crios|crmo/i],describe(r){let e={name:"Chrome"},t=s.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/GSA/i],describe(r){let e={name:"Google Search"},t=s.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test(r){let e=!r.test(/like android/i),t=r.test(/android/i);return e&&t},describe(r){let e={name:"Android Browser"},t=s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/playstation 4/i],describe(r){let e={name:"PlayStation 4"},t=s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/safari|applewebkit/i],describe(r){let e={name:"Safari"},t=s.getFirstMatch(n,r);return t&&(e.version=t),e}},{test:[/.*/i],describe(r){let e=/^(.*)\/(.*) /,t=/^(.*)\/(.*)[ \t]\((.*)/,a=r.search("\\(")!==-1?t:e;return{name:s.getFirstMatch(a,r),version:s.getSecondMatch(a,r)}}}],S=P;var B=[{test:[/Roku\/DVP/],describe(r){let e=s.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,r);return{name:b.Roku,version:e}}},{test:[/windows phone/i],describe(r){let e=s.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,r);return{name:b.WindowsPhone,version:e}}},{test:[/windows /i],describe(r){let e=s.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,r),t=s.getWindowsVersionName(e);return{name:b.Windows,version:e,versionName:t}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(r){let e={name:b.iOS},t=s.getSecondMatch(/(Version\/)(\d[\d.]+)/,r);return t&&(e.version=t),e}},{test:[/macintosh/i],describe(r){let e=s.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,r).replace(/[_\s]/g,"."),t=s.getMacOSVersionName(e),i={name:b.MacOS,version:e};return t&&(i.versionName=t),i}},{test:[/(ipod|iphone|ipad)/i],describe(r){let e=s.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,r).replace(/[_\s]/g,".");return{name:b.iOS,version:e}}},{test:[/OpenHarmony/i],describe(r){let e=s.getFirstMatch(/OpenHarmony\s+(\d+(\.\d+)*)/i,r);return{name:b.HarmonyOS,version:e}}},{test(r){let e=!r.test(/like android/i),t=r.test(/android/i);return e&&t},describe(r){let e=s.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,r),t=s.getAndroidVersionName(e),i={name:b.Android,version:e};return t&&(i.versionName=t),i}},{test:[/(web|hpw)[o0]s/i],describe(r){let e=s.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,r),t={name:b.WebOS};return e&&e.length&&(t.version=e),t}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(r){let e=s.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,r)||s.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,r)||s.getFirstMatch(/\bbb(\d+)/i,r);return{name:b.BlackBerry,version:e}}},{test:[/bada/i],describe(r){let e=s.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,r);return{name:b.Bada,version:e}}},{test:[/tizen/i],describe(r){let e=s.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,r);return{name:b.Tizen,version:e}}},{test:[/linux/i],describe(){return{name:b.Linux}}},{test:[/CrOS/],describe(){return{name:b.ChromeOS}}},{test:[/PlayStation 4/],describe(r){let e=s.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,r);return{name:b.PlayStation4,version:e}}}];var x=[{test:[/googlebot/i],describe(){return{type:o.bot,vendor:"Google"}}},{test:[/linespider/i],describe(){return{type:o.bot,vendor:"Line"}}},{test:[/amazonbot/i],describe(){return{type:o.bot,vendor:"Amazon"}}},{test:[/gptbot/i],describe(){return{type:o.bot,vendor:"OpenAI"}}},{test:[/chatgpt-user/i],describe(){return{type:o.bot,vendor:"OpenAI"}}},{test:[/oai-searchbot/i],describe(){return{type:o.bot,vendor:"OpenAI"}}},{test:[/baiduspider/i],describe(){return{type:o.bot,vendor:"Baidu"}}},{test:[/bingbot/i],describe(){return{type:o.bot,vendor:"Bing"}}},{test:[/duckduckbot/i],describe(){return{type:o.bot,vendor:"DuckDuckGo"}}},{test:[/claudebot/i,/claude-web/i,/claude-user/i,/claude-searchbot/i],describe(){return{type:o.bot,vendor:"Anthropic"}}},{test:[/omgilibot/i,/webzio-extended/i],describe(){return{type:o.bot,vendor:"Webz.io"}}},{test:[/diffbot/i],describe(){return{type:o.bot,vendor:"Diffbot"}}},{test:[/perplexitybot/i],describe(){return{type:o.bot,vendor:"Perplexity AI"}}},{test:[/perplexity-user/i],describe(){return{type:o.bot,vendor:"Perplexity AI"}}},{test:[/youbot/i],describe(){return{type:o.bot,vendor:"You.com"}}},{test:[/ia_archiver/i],describe(){return{type:o.bot,vendor:"Internet Archive"}}},{test:[/meta-webindexer/i],describe(){return{type:o.bot,vendor:"Meta"}}},{test:[/meta-externalads/i],describe(){return{type:o.bot,vendor:"Meta"}}},{test:[/meta-externalagent/i],describe(){return{type:o.bot,vendor:"Meta"}}},{test:[/meta-externalfetcher/i],describe(){return{type:o.bot,vendor:"Meta"}}},{test:[/facebookexternalhit/i,/facebookcatalog/i],describe(){return{type:o.bot,vendor:"Meta"}}},{test:[/slackbot/i,/slack-imgProxy/i],describe(){return{type:o.bot,vendor:"Slack"}}},{test:[/yahoo/i],describe(){return{type:o.bot,vendor:"Yahoo"}}},{test:[/yandexbot/i,/yandexmobilebot/i],describe(){return{type:o.bot,vendor:"Yandex"}}},{test:[/pingdom/i],describe(){return{type:o.bot,vendor:"Pingdom"}}},{test:[/huawei/i],describe(r){let e=s.getFirstMatch(/(can-l01)/i,r)&&"Nova",t={type:o.mobile,vendor:"Huawei"};return e&&(t.model=e),t}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe(){return{type:o.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe(){return{type:o.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(){return{type:o.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe(){return{type:o.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe(){return{type:o.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe(){return{type:o.tablet}}},{test(r){let e=r.test(/ipod|iphone/i),t=r.test(/like (ipod|iphone)/i);return e&&!t},describe(r){let e=s.getFirstMatch(/(ipod|iphone)/i,r);return{type:o.mobile,vendor:"Apple",model:e}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe(){return{type:o.mobile,vendor:"Nexus"}}},{test:[/Nokia/i],describe(r){let e=s.getFirstMatch(/Nokia\s+([0-9]+(\.[0-9]+)?)/i,r),t={type:o.mobile,vendor:"Nokia"};return e&&(t.model=e),t}},{test:[/[^-]mobi/i],describe(){return{type:o.mobile}}},{test(r){return r.getBrowserName(!0)==="blackberry"},describe(){return{type:o.mobile,vendor:"BlackBerry"}}},{test(r){return r.getBrowserName(!0)==="bada"},describe(){return{type:o.mobile}}},{test(r){return r.getBrowserName()==="windows phone"},describe(){return{type:o.mobile,vendor:"Microsoft"}}},{test(r){let e=Number(String(r.getOSVersion()).split(".")[0]);return r.getOSName(!0)==="android"&&e>=3},describe(){return{type:o.tablet}}},{test(r){return r.getOSName(!0)==="android"},describe(){return{type:o.mobile}}},{test:[/smart-?tv|smarttv/i],describe(){return{type:o.tv}}},{test:[/netcast/i],describe(){return{type:o.tv}}},{test(r){return r.getOSName(!0)==="macos"},describe(){return{type:o.desktop,vendor:"Apple"}}},{test(r){return r.getOSName(!0)==="windows"},describe(){return{type:o.desktop}}},{test(r){return r.getOSName(!0)==="linux"},describe(){return{type:o.desktop}}},{test(r){return r.getOSName(!0)==="playstation 4"},describe(){return{type:o.tv}}},{test(r){return r.getOSName(!0)==="roku"},describe(){return{type:o.tv}}}];var k=[{test(r){return r.getBrowserName(!0)==="microsoft edge"},describe(r){if(/\sedg\//i.test(r))return{name:m.Blink};let t=s.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,r);return{name:m.EdgeHTML,version:t}}},{test:[/trident/i],describe(r){let e={name:m.Trident},t=s.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test(r){return r.test(/presto/i)},describe(r){let e={name:m.Presto},t=s.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test(r){let e=r.test(/gecko/i),t=r.test(/like gecko/i);return e&&!t},describe(r){let e={name:m.Gecko},t=s.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}},{test:[/(apple)?webkit\/537\.36/i],describe(){return{name:m.Blink}}},{test:[/(apple)?webkit/i],describe(r){let e={name:m.WebKit},t=s.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,r);return t&&(e.version=t),e}}];var w=class{static{f(this,"Parser")}constructor(e,t=!1,i=null){if(e==null||e==="")throw new Error("UserAgent parameter can't be empty");this._ua=e;let a=!1;typeof t=="boolean"?(a=t,this._hints=i):t!=null&&typeof t=="object"?this._hints=t:this._hints=null,this.parsedResult={},a!==!0&&this.parse()}getHints(){return this._hints}hasBrand(e){if(!this._hints||!Array.isArray(this._hints.brands))return!1;let t=e.toLowerCase();return this._hints.brands.some(i=>i.brand&&i.brand.toLowerCase()===t)}getBrandVersion(e){if(!this._hints||!Array.isArray(this._hints.brands))return;let t=e.toLowerCase(),i=this._hints.brands.find(a=>a.brand&&a.brand.toLowerCase()===t);return i?i.version:void 0}getUA(){return this._ua}test(e){return e.test(this._ua)}parseBrowser(){this.parsedResult.browser={};let e=s.find(S,t=>{if(typeof t.test=="function")return t.test(this);if(Array.isArray(t.test))return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.browser=e.describe(this.getUA(),this)),this.parsedResult.browser}getBrowser(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()}getBrowserName(e){return e?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""}getBrowserVersion(){return this.getBrowser().version}getOS(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()}parseOS(){this.parsedResult.os={};let e=s.find(B,t=>{if(typeof t.test=="function")return t.test(this);if(Array.isArray(t.test))return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.os=e.describe(this.getUA())),this.parsedResult.os}getOSName(e){let{name:t}=this.getOS();return e?String(t).toLowerCase()||"":t||""}getOSVersion(){return this.getOS().version}getPlatform(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()}getPlatformType(e=!1){let{type:t}=this.getPlatform();return e?String(t).toLowerCase()||"":t||""}parsePlatform(){this.parsedResult.platform={};let e=s.find(x,t=>{if(typeof t.test=="function")return t.test(this);if(Array.isArray(t.test))return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.platform=e.describe(this.getUA())),this.parsedResult.platform}getEngine(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()}getEngineName(e){return e?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""}parseEngine(){this.parsedResult.engine={};let e=s.find(k,t=>{if(typeof t.test=="function")return t.test(this);if(Array.isArray(t.test))return t.test.some(i=>this.test(i));throw new Error("Browser's test function is not valid")});return e&&(this.parsedResult.engine=e.describe(this.getUA())),this.parsedResult.engine}parse(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this}getResult(){return s.assign({},this.parsedResult)}satisfies(e){let t={},i=0,a={},c=0;if(Object.keys(e).forEach(l=>{let d=e[l];typeof d=="string"?(a[l]=d,c+=1):typeof d=="object"&&(t[l]=d,i+=1)}),i>0){let l=Object.keys(t),d=s.find(l,h=>this.isOS(h));if(d){let h=this.satisfies(t[d]);if(h!==void 0)return h}let g=s.find(l,h=>this.isPlatform(h));if(g){let h=this.satisfies(t[g]);if(h!==void 0)return h}}if(c>0){let l=Object.keys(a),d=s.find(l,g=>this.isBrowser(g,!0));if(d!==void 0)return this.compareVersion(a[d])}}isBrowser(e,t=!1){let i=this.getBrowserName().toLowerCase(),a=e.toLowerCase(),c=s.getBrowserTypeByAlias(a);return t&&c&&(a=c.toLowerCase()),a===i}compareVersion(e){let t=[0],i=e,a=!1,c=this.getBrowserVersion();if(typeof c=="string")return e[0]===">"||e[0]==="<"?(i=e.substr(1),e[1]==="="?(a=!0,i=e.substr(2)):t=[],e[0]===">"?t.push(1):t.push(-1)):e[0]==="="?i=e.substr(1):e[0]==="~"&&(a=!0,i=e.substr(1)),t.indexOf(s.compareVersions(c,i,a))>-1}isOS(e){return this.getOSName(!0)===String(e).toLowerCase()}isPlatform(e){return this.getPlatformType(!0)===String(e).toLowerCase()}isEngine(e){return this.getEngineName(!0)===String(e).toLowerCase()}is(e,t=!1){return this.isBrowser(e,t)||this.isOS(e)||this.isPlatform(e)}some(e=[]){return e.some(t=>this.is(t))}},v=w;var M=class{static{f(this,"Bowser")}static getParser(e,t=!1,i=null){if(typeof e!="string")throw new Error("UserAgent should be a string");return new v(e,t,i)}static parse(e,t=null){return new v(e,t).getResult()}static get BROWSER_MAP(){return p}static get ENGINE_MAP(){return m}static get OS_MAP(){return b}static get PLATFORMS_MAP(){return o}},$=M;export{$ as default};
|