diff --git a/.env.example b/.env.example index 7c8efb9f9a..d3bb927eb9 100644 --- a/.env.example +++ b/.env.example @@ -13,3 +13,4 @@ APPWRITE_DB_INIT_ID= APPWRITE_COL_INIT_ID= APPWRITE_API_KEY_INIT= SENTRY_AUTH_TOKEN= +STATSIG_SERVER_SECRET= diff --git a/.github/workflows/production.yml b/.github/workflows/production.yml index 5a708156a3..e97dbf938c 100644 --- a/.github/workflows/production.yml +++ b/.github/workflows/production.yml @@ -83,6 +83,12 @@ jobs: --docker-email=ci@appwrite.io \ --dry-run=client -o yaml | kubectl apply -f - + - name: Create app secrets + run: | + kubectl -n website create secret generic website-secrets \ + --from-literal=STATSIG_SERVER_SECRET='${{ secrets.STATSIG_SERVER_SECRET }}' \ + --dry-run=client -o yaml | kubectl apply -f - + - name: Deploy run: | helm upgrade --install --namespace website website deploy/website/ \ diff --git a/.github/workflows/staging.yml b/.github/workflows/staging.yml index f371bd4bab..7bf3e1bfd6 100644 --- a/.github/workflows/staging.yml +++ b/.github/workflows/staging.yml @@ -83,6 +83,12 @@ jobs: --docker-email=ci@appwrite.io \ --dry-run=client -o yaml | kubectl apply -f - + - name: Create app secrets + run: | + kubectl -n website create secret generic website-secrets \ + --from-literal=STATSIG_SERVER_SECRET='${{ secrets.STATSIG_SERVER_SECRET }}' \ + --dry-run=client -o yaml | kubectl apply -f - + - name: Deploy run: | helm upgrade --install --namespace website website deploy/website/ \ diff --git a/bun.lock b/bun.lock index f6c96bcc7b..c0929ba081 100644 --- a/bun.lock +++ b/bun.lock @@ -6,8 +6,12 @@ "name": "appwrite-website", "dependencies": { "@sentry/sveltekit": "^10.28.0", + "@statsig/js-client": "^3.33.0", + "@statsig/session-replay": "^3.33.0", + "@statsig/web-analytics": "^3.33.0", "h3": "^1.15.4", "sharp": "^0.34.5", + "statsig-node": "^6.5.1", }, "devDependencies": { "@appwrite.io/console": "^0.6.4", @@ -664,6 +668,12 @@ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.48.1", "", { "os": "win32", "cpu": "x64" }, "sha512-8a/caCUN4vkTChxkaIJcMtwIVcBhi4X2PQRoT+yCK3qRYaZ7cURrmJFL5Ux9H9RaMIXj9RuihckdmkBX3zZsgg=="], + "@rrweb/record": ["@rrweb/record@2.0.0-alpha.17", "", { "dependencies": { "@rrweb/types": "^2.0.0-alpha.17", "rrweb": "^2.0.0-alpha.17" } }, "sha512-Je+lzjeWMF8/I0IDoXFzkGPKT8j7AkaBup5YcwUHlkp18VhLVze416MvI6915teE27uUA2ScXMXzG0Yiu5VTIw=="], + + "@rrweb/types": ["@rrweb/types@2.0.0-alpha.20", "", {}, "sha512-RbnDgKxA/odwB1R4gF7eUUj+rdSrq6ROQJsnMw7MIsGzlbSYvJeZN8YY4XqU0G6sKJvXI6bSzk7w/G94jNwzhw=="], + + "@rrweb/utils": ["@rrweb/utils@2.0.0-alpha.20", "", {}, "sha512-MTQOmhPRe39C0fYaCnnVYOufQsyGzwNXpUStKiyFSfGLUJrzuwhbRoUAKR5w6W2j5XuA0bIz3ZDIBztkquOhLw=="], + "@sentry-internal/browser-utils": ["@sentry-internal/browser-utils@10.28.0", "", { "dependencies": { "@sentry/core": "10.28.0" } }, "sha512-FYcslFXo+Lq5/9/G83NSVK2vQlcXRkbJ6AHrMwZyPv1Qd9KJ08qoZo4buxMv63MzYDicNF591HBAqCxsv5gXsA=="], "@sentry-internal/feedback": ["@sentry-internal/feedback@10.28.0", "", { "dependencies": { "@sentry/core": "10.28.0" } }, "sha512-vIv59ZN7Ig/oa6se/qGR69Odx3SQRoW2sIcbmJpxbjRF44Re0ZLFk6vBB3AyUvU3Lqnvabbw3y5AAwJt7Z//ug=="], @@ -716,6 +726,14 @@ "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], + "@statsig/client-core": ["@statsig/client-core@3.33.0", "", {}, "sha512-i0eiAtFkm7Ny38etC5rJ/fkWiAECgyfK23/KIFk8z8LvPW77QmUXJfNeTqFikEOKAsAGU/pxXmchpo8hn9nWBA=="], + + "@statsig/js-client": ["@statsig/js-client@3.33.0", "", { "dependencies": { "@statsig/client-core": "3.33.0" } }, "sha512-jwAjyCI0FQSvoviQqdO2u1pchuG88eUT2/EoCtEV4vda4XilzuX3eUBK+J2nhRZB2u8CLNV7PZoONdy/Tls7yQ=="], + + "@statsig/session-replay": ["@statsig/session-replay@3.33.0", "", { "dependencies": { "@rrweb/record": "2.0.0-alpha.17", "@statsig/client-core": "3.33.0", "rrweb": "2.0.0-alpha.17" } }, "sha512-sHWFczZGnn9E0JzuB5QH02WGX61Q9ZsBEHD6Z0EHcldKMs33KanE1tTvraRlCMSy8hlbyVdtjwjc4KBAmtABxQ=="], + + "@statsig/web-analytics": ["@statsig/web-analytics@3.33.0", "", { "dependencies": { "@statsig/client-core": "3.33.0", "@statsig/js-client": "3.33.0", "web-vitals": "5.0.3" } }, "sha512-M0uNIWeJHkcWh6f1Dg4YeHMCza7nzBSk1wFktNsu48viwhp6qCz7ucNMdjgpM4s2FL/mzVf+jHvZpuB7Z9aL4A=="], + "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.5", "", { "peerDependencies": { "acorn": "8.15.0" } }, "sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ=="], "@sveltejs/adapter-node": ["@dittmann/adapter-node@5.3.3", "", { "dependencies": { "rolldown": "1.0.0-beta.45" }, "peerDependencies": { "@sveltejs/kit": "^2.4.0" } }, "sha512-MusJzr7eXgKVZu21qKO46VbzNR7JjcMK358QvLwZs3F9wXBMFYdJ3y70NaNdPfZGUdZQWGh4MEfch9pTA/Qddw=="], @@ -796,6 +814,8 @@ "@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="], + "@types/css-font-loading-module": ["@types/css-font-loading-module@0.0.7", "", {}, "sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q=="], + "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], "@types/dlv": ["@types/dlv@1.1.5", "", {}, "sha512-JHOWNfiWepAhfwlSw17kiWrWrk6od2dEQgHltJw9AS0JPFoLZJBge5+Dnil2NfdjAvJ/+vGSX60/BRW20PpUXw=="], @@ -896,6 +916,8 @@ "@xmldom/xmldom": ["@xmldom/xmldom@0.7.13", "", {}, "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g=="], + "@xstate/fsm": ["@xstate/fsm@1.6.5", "", {}, "sha512-b5o1I6aLNeYlU/3CPlj/Z91ybk1gUsKT+5NAJI+2W4UjvS5KLG28K9v5UvNoFVjHV8PajVZ00RH3vnjyQO7ZAw=="], + "abbrev": ["abbrev@1.1.1", "", {}, "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="], "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "5.0.1" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], @@ -960,6 +982,8 @@ "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "base64-arraybuffer": ["base64-arraybuffer@1.0.2", "", {}, "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ=="], + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], "baseline-browser-mapping": ["baseline-browser-mapping@2.8.6", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw=="], @@ -1376,6 +1400,8 @@ "ip-address": ["ip-address@10.0.1", "", {}, "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA=="], + "ip3country": ["ip3country@5.0.0", "", {}, "sha512-lcFLMFU4eO1Z7tIpbVFZkaZ5ltqpeaRx7L9NsAbA9uA7/O/rj3RF8+evE5gDitooaTTIqjdzZrenFO/OOxQ2ew=="], + "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], "is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="], @@ -1802,6 +1828,12 @@ "rollup": ["rollup@4.48.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.48.1", "@rollup/rollup-android-arm64": "4.48.1", "@rollup/rollup-darwin-arm64": "4.48.1", "@rollup/rollup-darwin-x64": "4.48.1", "@rollup/rollup-freebsd-arm64": "4.48.1", "@rollup/rollup-freebsd-x64": "4.48.1", "@rollup/rollup-linux-arm-gnueabihf": "4.48.1", "@rollup/rollup-linux-arm-musleabihf": "4.48.1", "@rollup/rollup-linux-arm64-gnu": "4.48.1", "@rollup/rollup-linux-arm64-musl": "4.48.1", "@rollup/rollup-linux-loongarch64-gnu": "4.48.1", "@rollup/rollup-linux-ppc64-gnu": "4.48.1", "@rollup/rollup-linux-riscv64-gnu": "4.48.1", "@rollup/rollup-linux-riscv64-musl": "4.48.1", "@rollup/rollup-linux-s390x-gnu": "4.48.1", "@rollup/rollup-linux-x64-gnu": "4.48.1", "@rollup/rollup-linux-x64-musl": "4.48.1", "@rollup/rollup-win32-arm64-msvc": "4.48.1", "@rollup/rollup-win32-ia32-msvc": "4.48.1", "@rollup/rollup-win32-x64-msvc": "4.48.1", "fsevents": "2.3.3" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-jVG20NvbhTYDkGAty2/Yh7HK6/q3DGSRH4o8ALKGArmMuaauM9kLfoMZ+WliPwA5+JHr2lTn3g557FxBV87ifg=="], + "rrdom": ["rrdom@2.0.0-alpha.20", "", { "dependencies": { "rrweb-snapshot": "^2.0.0-alpha.20" } }, "sha512-hoqjS4662LtBp82qEz9GrqU36UpEmCvTA2Hns3qdF7cklLFFy3G+0Th8hLytJENleHHWxsB5nWJ3eXz5mSRxdQ=="], + + "rrweb": ["rrweb@2.0.0-alpha.17", "", { "dependencies": { "@rrweb/types": "^2.0.0-alpha.17", "@rrweb/utils": "^2.0.0-alpha.17", "@types/css-font-loading-module": "0.0.7", "@xstate/fsm": "^1.4.0", "base64-arraybuffer": "^1.0.1", "mitt": "^3.0.0", "rrdom": "^2.0.0-alpha.17", "rrweb-snapshot": "^2.0.0-alpha.17" } }, "sha512-GQxBkCC4r9XL2bwSdv7iIS49M3cEA8OtObVq0rrQ4GUT4+h7omucGQ4x7m5YN5Vq1oalStBaBlYqF7yRnfG3JA=="], + + "rrweb-snapshot": ["rrweb-snapshot@2.0.0-alpha.20", "", { "dependencies": { "postcss": "^8.4.38" } }, "sha512-YTNf9YVeaGRo/jxY3FKBge2c/Ojd/KTHmuWloUSB+oyPXuY73ZeeG873qMMmhIpqEn7hn7aBF1eWEQmP7wjf8A=="], + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "1.2.3" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], "runed": ["runed@0.23.4", "", { "dependencies": { "esm-env": "1.2.2" }, "peerDependencies": { "svelte": "5.42.2" } }, "sha512-9q8oUiBYeXIDLWNK5DfCWlkL0EW3oGbk845VdKlPeia28l751VpfesaB/+7pI6rnbx1I6rqoZ2fZxptOJLxILA=="], @@ -1856,6 +1888,8 @@ "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], + "statsig-node": ["statsig-node@6.5.1", "", { "dependencies": { "ip3country": "^5.0.0", "node-fetch": "^2.7.0", "ua-parser-js": "^1.0.2", "uuid": "^8.3.2" } }, "sha512-/rKvMMN9SWTK8+b7MyRP1wOsStsKf55Mdj8O2ffV/bCQ/38bXYCC/GVd3gVvBSwVCibAnkTz2v1gpRJSIKsBIg=="], + "std-env": ["std-env@3.9.0", "", {}, "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw=="], "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1994,6 +2028,8 @@ "typescript-eslint": ["typescript-eslint@8.48.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.48.1", "@typescript-eslint/parser": "8.48.1", "@typescript-eslint/typescript-estree": "8.48.1", "@typescript-eslint/utils": "8.48.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-FbOKN1fqNoXp1hIl5KYpObVrp0mCn+CLgn479nmu2IsRMrx2vyv74MmsBLVlhg8qVwNFGbXSp8fh1zp8pEoC2A=="], + "ua-parser-js": ["ua-parser-js@1.0.41", "", { "bin": { "ua-parser-js": "script/cli.js" } }, "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug=="], + "uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="], "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], @@ -2022,6 +2058,8 @@ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + "validator": ["validator@13.15.15", "", {}, "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A=="], "vaul-svelte": ["vaul-svelte@1.0.0-next.7", "", { "dependencies": { "runed": "0.23.4", "svelte-toolbelt": "0.7.1" }, "peerDependencies": { "svelte": "5.42.2" } }, "sha512-7zN7Bi3dFQixvvbUJY9uGDe7Ws/dGZeBQR2pXdXmzQiakjrxBvWo0QrmsX3HK+VH+SZOltz378cmgmCS9f9rSg=="], @@ -2158,6 +2196,8 @@ "@sentry/sveltekit/magic-string": ["magic-string@0.30.7", "", { "dependencies": { "@jridgewell/sourcemap-codec": "1.5.5" } }, "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA=="], + "@statsig/web-analytics/web-vitals": ["web-vitals@5.0.3", "", {}, "sha512-4KmOFYxj7qT6RAdCH0SWwq8eKeXNhAFXR4PmgF6nrWFmrJ41n7lq3UCA6UK0GebQ4uu+XP8e8zGjaDO3wZlqTg=="], + "@sveltejs/enhanced-img/magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], "@sveltejs/kit/magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], @@ -2266,6 +2306,8 @@ "ssri/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + "statsig-node/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "5.0.0" }, "optionalDependencies": { "encoding": "0.1.13" } }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + "string_decoder/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], diff --git a/deploy/website/templates/website.yaml b/deploy/website/templates/website.yaml index 4fa178f4cd..ded2f08379 100644 --- a/deploy/website/templates/website.yaml +++ b/deploy/website/templates/website.yaml @@ -38,6 +38,12 @@ spec: env: - name: NODE_OPTIONS value: "--max-old-space-size=400" + - name: STATSIG_SERVER_SECRET + valueFrom: + secretKeyRef: + name: website-secrets + key: STATSIG_SERVER_SECRET + optional: true ports: - containerPort: 3000 startupProbe: diff --git a/package.json b/package.json index 234ebba157..1072c7a41d 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,12 @@ }, "dependencies": { "@sentry/sveltekit": "^10.28.0", + "@statsig/js-client": "^3.33.0", + "@statsig/session-replay": "^3.33.0", + "@statsig/web-analytics": "^3.33.0", "h3": "^1.15.4", - "sharp": "^0.34.5" + "sharp": "^0.34.5", + "statsig-node": "^6.5.1" }, "devDependencies": { "@appwrite.io/console": "^0.6.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b9634ad883..02619aa48d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,12 +10,24 @@ importers: '@sentry/sveltekit': specifier: ^10.28.0 version: 10.29.0(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.95.0)(yaml@2.8.1)))(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.95.0)(yaml@2.8.1)))(encoding@0.1.13)(svelte@5.45.8)(vite@7.2.7(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.95.0)(yaml@2.8.1)) + '@statsig/js-client': + specifier: ^3.33.0 + version: 3.33.0 + '@statsig/session-replay': + specifier: ^3.33.0 + version: 3.33.0 + '@statsig/web-analytics': + specifier: ^3.33.0 + version: 3.33.0 h3: specifier: ^1.15.4 version: 1.15.4 sharp: specifier: ^0.34.5 version: 0.34.5 + statsig-node: + specifier: ^6.5.1 + version: 6.5.1(encoding@0.1.13) devDependencies: '@appwrite.io/console': specifier: ^0.6.4 @@ -27,8 +39,8 @@ importers: specifier: ~0.26.0 version: 0.26.0 '@appwrite.io/specs': - specifier: github:appwrite/specs#bd8ee024995358cea176e4279b1cc362fc6e9c00 - version: https://codeload.github.com/appwrite/specs/tar.gz/bd8ee024995358cea176e4279b1cc362fc6e9c00 + specifier: github:appwrite/specs#095d750d7036626d949279ddb7cd9510b902a13f + version: https://codeload.github.com/appwrite/specs/tar.gz/095d750d7036626d949279ddb7cd9510b902a13f '@eslint/compat': specifier: ^1.4.1 version: 1.4.1(eslint@9.39.1(jiti@2.6.1)) @@ -38,6 +50,9 @@ importers: '@fingerprintjs/fingerprintjs': specifier: ^4.6.2 version: 4.6.2 + '@growthbook/growthbook': + specifier: ^1.6.5 + version: 1.6.5 '@internationalized/date': specifier: 3.5.0 version: 3.5.0 @@ -356,10 +371,10 @@ packages: integrity: sha512-iPeGE56pauzxuIXt15ZswjKCErwp3QdF3XOlJZfyYY7J2nirra85JNTL+3lWuFIf8yYWL7NbvCjhf8ig79TgwA== } - '@appwrite.io/specs@https://codeload.github.com/appwrite/specs/tar.gz/bd8ee024995358cea176e4279b1cc362fc6e9c00': + '@appwrite.io/specs@https://codeload.github.com/appwrite/specs/tar.gz/095d750d7036626d949279ddb7cd9510b902a13f': resolution: { - tarball: https://codeload.github.com/appwrite/specs/tar.gz/bd8ee024995358cea176e4279b1cc362fc6e9c00 + tarball: https://codeload.github.com/appwrite/specs/tar.gz/095d750d7036626d949279ddb7cd9510b902a13f } version: 0.0.0 @@ -846,6 +861,13 @@ packages: integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== } + '@growthbook/growthbook@1.6.5': + resolution: + { + integrity: sha512-mUaMsgeUTpRIUOTn33EUXHRK6j7pxBjwqH4WpQyq+pukjd1AIzWlEa6w7i6bInJUcweGgP2beXZmaP6b6UPn7A== + } + engines: { node: '>=10' } + '@humanfs/core@0.19.1': resolution: { @@ -2451,6 +2473,24 @@ packages: cpu: [x64] os: [win32] + '@rrweb/record@2.0.0-alpha.17': + resolution: + { + integrity: sha512-Je+lzjeWMF8/I0IDoXFzkGPKT8j7AkaBup5YcwUHlkp18VhLVze416MvI6915teE27uUA2ScXMXzG0Yiu5VTIw== + } + + '@rrweb/types@2.0.0-alpha.20': + resolution: + { + integrity: sha512-RbnDgKxA/odwB1R4gF7eUUj+rdSrq6ROQJsnMw7MIsGzlbSYvJeZN8YY4XqU0G6sKJvXI6bSzk7w/G94jNwzhw== + } + + '@rrweb/utils@2.0.0-alpha.20': + resolution: + { + integrity: sha512-MTQOmhPRe39C0fYaCnnVYOufQsyGzwNXpUStKiyFSfGLUJrzuwhbRoUAKR5w6W2j5XuA0bIz3ZDIBztkquOhLw== + } + '@sentry-internal/browser-utils@10.29.0': resolution: { @@ -2674,6 +2714,30 @@ packages: integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA== } + '@statsig/client-core@3.33.0': + resolution: + { + integrity: sha512-i0eiAtFkm7Ny38etC5rJ/fkWiAECgyfK23/KIFk8z8LvPW77QmUXJfNeTqFikEOKAsAGU/pxXmchpo8hn9nWBA== + } + + '@statsig/js-client@3.33.0': + resolution: + { + integrity: sha512-jwAjyCI0FQSvoviQqdO2u1pchuG88eUT2/EoCtEV4vda4XilzuX3eUBK+J2nhRZB2u8CLNV7PZoONdy/Tls7yQ== + } + + '@statsig/session-replay@3.33.0': + resolution: + { + integrity: sha512-sHWFczZGnn9E0JzuB5QH02WGX61Q9ZsBEHD6Z0EHcldKMs33KanE1tTvraRlCMSy8hlbyVdtjwjc4KBAmtABxQ== + } + + '@statsig/web-analytics@3.33.0': + resolution: + { + integrity: sha512-M0uNIWeJHkcWh6f1Dg4YeHMCza7nzBSk1wFktNsu48viwhp6qCz7ucNMdjgpM4s2FL/mzVf+jHvZpuB7Z9aL4A== + } + '@sveltejs/acorn-typescript@1.0.6': resolution: { @@ -2988,6 +3052,12 @@ packages: integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== } + '@types/css-font-loading-module@0.0.7': + resolution: + { + integrity: sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q== + } + '@types/deep-eql@4.0.2': resolution: { @@ -3364,6 +3434,12 @@ packages: engines: { node: '>=10.0.0' } deprecated: this version is no longer supported, please update to at least 0.8.* + '@xstate/fsm@1.6.5': + resolution: + { + integrity: sha512-b5o1I6aLNeYlU/3CPlj/Z91ybk1gUsKT+5NAJI+2W4UjvS5KLG28K9v5UvNoFVjHV8PajVZ00RH3vnjyQO7ZAw== + } + abbrev@1.1.1: resolution: { @@ -3602,6 +3678,13 @@ packages: integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } + base64-arraybuffer@1.0.2: + resolution: + { + integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== + } + engines: { node: '>= 0.6.0' } + base64-js@1.5.1: resolution: { @@ -4190,6 +4273,13 @@ packages: integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== } + dom-mutator@0.6.0: + resolution: + { + integrity: sha512-iCt9o0aYfXMUkz/43ZOAUFQYotjGB+GNbYJiJdz4TgXkyToXbbRy5S6FbTp72lRBtfpUMwEc1KmpFEU4CZeoNg== + } + engines: { node: '>=10' } + dom-serializer@2.0.0: resolution: { @@ -5168,6 +5258,12 @@ packages: } engines: { node: '>= 12' } + ip3country@5.0.0: + resolution: + { + integrity: sha512-lcFLMFU4eO1Z7tIpbVFZkaZ5ltqpeaRx7L9NsAbA9uA7/O/rj3RF8+evE5gDitooaTTIqjdzZrenFO/OOxQ2ew== + } + iron-webcrypto@1.2.1: resolution: { @@ -6868,6 +6964,24 @@ packages: engines: { node: '>=18.0.0', npm: '>=8.0.0' } hasBin: true + rrdom@2.0.0-alpha.20: + resolution: + { + integrity: sha512-hoqjS4662LtBp82qEz9GrqU36UpEmCvTA2Hns3qdF7cklLFFy3G+0Th8hLytJENleHHWxsB5nWJ3eXz5mSRxdQ== + } + + rrweb-snapshot@2.0.0-alpha.20: + resolution: + { + integrity: sha512-YTNf9YVeaGRo/jxY3FKBge2c/Ojd/KTHmuWloUSB+oyPXuY73ZeeG873qMMmhIpqEn7hn7aBF1eWEQmP7wjf8A== + } + + rrweb@2.0.0-alpha.17: + resolution: + { + integrity: sha512-GQxBkCC4r9XL2bwSdv7iIS49M3cEA8OtObVq0rrQ4GUT4+h7omucGQ4x7m5YN5Vq1oalStBaBlYqF7yRnfG3JA== + } + run-parallel@1.2.0: resolution: { @@ -7063,6 +7177,13 @@ packages: integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== } + statsig-node@6.5.1: + resolution: + { + integrity: sha512-/rKvMMN9SWTK8+b7MyRP1wOsStsKf55Mdj8O2ffV/bCQ/38bXYCC/GVd3gVvBSwVCibAnkTz2v1gpRJSIKsBIg== + } + engines: { pnpm: never } + std-env@3.10.0: resolution: { @@ -7572,6 +7693,13 @@ packages: engines: { node: '>=14.17' } hasBin: true + ua-parser-js@1.0.41: + resolution: + { + integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug== + } + hasBin: true + uc.micro@2.1.0: resolution: { @@ -7663,6 +7791,13 @@ packages: integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== } + uuid@8.3.2: + resolution: + { + integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + } + hasBin: true + validator@13.15.22: resolution: { @@ -7820,6 +7955,12 @@ packages: integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw== } + web-vitals@5.0.3: + resolution: + { + integrity: sha512-4KmOFYxj7qT6RAdCH0SWwq8eKeXNhAFXR4PmgF6nrWFmrJ41n7lq3UCA6UK0GebQ4uu+XP8e8zGjaDO3wZlqTg== + } + webgl-sdf-generator@1.1.1: resolution: { @@ -8105,7 +8246,7 @@ snapshots: normalize.css: 8.0.1 the-new-css-reset: 1.11.3 - '@appwrite.io/specs@https://codeload.github.com/appwrite/specs/tar.gz/bd8ee024995358cea176e4279b1cc362fc6e9c00': + '@appwrite.io/specs@https://codeload.github.com/appwrite/specs/tar.gz/095d750d7036626d949279ddb7cd9510b902a13f': {} '@babel/code-frame@7.27.1': @@ -8368,6 +8509,10 @@ snapshots: '@gar/promisify@1.1.3': {} + '@growthbook/growthbook@1.6.5': + dependencies: + dom-mutator: 0.6.0 + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.7': @@ -9387,6 +9532,15 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.53.2': optional: true + '@rrweb/record@2.0.0-alpha.17': + dependencies: + '@rrweb/types': 2.0.0-alpha.20 + rrweb: 2.0.0-alpha.17 + + '@rrweb/types@2.0.0-alpha.20': {} + + '@rrweb/utils@2.0.0-alpha.20': {} + '@sentry-internal/browser-utils@10.29.0': dependencies: '@sentry/core': 10.29.0 @@ -9584,6 +9738,24 @@ snapshots: '@standard-schema/spec@1.0.0': {} + '@statsig/client-core@3.33.0': {} + + '@statsig/js-client@3.33.0': + dependencies: + '@statsig/client-core': 3.33.0 + + '@statsig/session-replay@3.33.0': + dependencies: + '@rrweb/record': 2.0.0-alpha.17 + '@statsig/client-core': 3.33.0 + rrweb: 2.0.0-alpha.17 + + '@statsig/web-analytics@3.33.0': + dependencies: + '@statsig/client-core': 3.33.0 + '@statsig/js-client': 3.33.0 + web-vitals: 5.0.3 + '@sveltejs/acorn-typescript@1.0.6(acorn@8.15.0)': dependencies: acorn: 8.15.0 @@ -9818,6 +9990,8 @@ snapshots: '@types/cookie@0.6.0': {} + '@types/css-font-loading-module@0.0.7': {} + '@types/deep-eql@4.0.2': {} '@types/dlv@1.1.5': {} @@ -10089,6 +10263,8 @@ snapshots: '@xmldom/xmldom@0.7.13': {} + '@xstate/fsm@1.6.5': {} + abbrev@1.1.1: {} abort-controller@3.0.0: @@ -10212,6 +10388,8 @@ snapshots: balanced-match@1.0.2: {} + base64-arraybuffer@1.0.2: {} + base64-js@1.5.1: {} baseline-browser-mapping@2.8.25: {} @@ -10550,6 +10728,8 @@ snapshots: dlv@1.1.3: {} + dom-mutator@0.6.0: {} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -11146,6 +11326,8 @@ snapshots: ip-address@10.1.0: {} + ip3country@5.0.0: {} + iron-webcrypto@1.2.1: {} is-binary-path@2.1.0: @@ -12059,6 +12241,25 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.53.2 fsevents: 2.3.3 + rrdom@2.0.0-alpha.20: + dependencies: + rrweb-snapshot: 2.0.0-alpha.20 + + rrweb-snapshot@2.0.0-alpha.20: + dependencies: + postcss: 8.5.6 + + rrweb@2.0.0-alpha.17: + dependencies: + '@rrweb/types': 2.0.0-alpha.20 + '@rrweb/utils': 2.0.0-alpha.20 + '@types/css-font-loading-module': 0.0.7 + '@xstate/fsm': 1.6.5 + base64-arraybuffer: 1.0.2 + mitt: 3.0.1 + rrdom: 2.0.0-alpha.20 + rrweb-snapshot: 2.0.0-alpha.20 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -12182,6 +12383,15 @@ snapshots: stackback@0.0.2: {} + statsig-node@6.5.1(encoding@0.1.13): + dependencies: + ip3country: 5.0.0 + node-fetch: 2.7.0(encoding@0.1.13) + ua-parser-js: 1.0.41 + uuid: 8.3.2 + transitivePeerDependencies: + - encoding + std-env@3.10.0: {} string-width@4.2.3: @@ -12526,6 +12736,8 @@ snapshots: typescript@5.9.3: {} + ua-parser-js@1.0.41: {} + uc.micro@2.1.0: {} ufo@1.6.1: {} @@ -12571,6 +12783,8 @@ snapshots: util-deprecate@1.0.2: {} + uuid@8.3.2: {} + validator@13.15.22: {} vaul-svelte@1.0.0-next.7(svelte@5.45.8): @@ -12690,6 +12904,8 @@ snapshots: web-vitals@4.2.4: {} + web-vitals@5.0.3: {} + webgl-sdf-generator@1.1.1: {} webidl-conversions@3.0.1: {} diff --git a/src/app.html b/src/app.html index 362d674ba4..a78a06d29b 100644 --- a/src/app.html +++ b/src/app.html @@ -28,8 +28,8 @@ sizes="120x120" /> - - + + diff --git a/src/hooks.server.ts b/src/hooks.server.ts index 20817cfa39..b670cee10f 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -117,9 +117,24 @@ const securityheaders: Handle = async ({ event, resolve }) => { 'https://js.zi-scripts.com', 'https://aorta.clickagy.com', 'https://hemsync.clickagy.com', - 'https://ws.zoominfo.com ', + 'https://ws.zoominfo.com', 'https://*.cookieyes.com', - 'https://cdn-cookieyes.com' + 'https://cdn-cookieyes.com', + // Statsig JS client + session replay + web analytics + // https://docs.statsig.com/client/jsClientSDK#content-security-policy + 'https://api.statsig.com', + 'https://*.statsig.com', + 'https://featuregates.org', + 'https://statsigapi.net', + 'https://*.statsigapi.net', + 'https://events.statsigapi.net', + 'https://api.statsigcdn.com', + 'https://*.statsigcdn.com', + 'https://featureassets.org', + 'https://assetsconfigcdn.org', + 'https://prodregistryv2.org', + 'https://cloudflare-dns.com', + 'https://beyondwickedmapping.org' ]), 'frame-src': join([ "'self'", diff --git a/src/lib/actions/analytics.ts b/src/lib/actions/analytics.ts index ee6463ff78..aa1a583f3b 100644 --- a/src/lib/actions/analytics.ts +++ b/src/lib/actions/analytics.ts @@ -1,6 +1,8 @@ import { page } from '$app/state'; import { ENV } from '$lib/system'; import { browser } from '$app/environment'; +import { shouldForwardAnalyticsToStatsig } from '$lib/statsig/cta-events'; +import { logStatsigCtaEvent } from '$lib/statsig/client'; import posthogEvent from 'posthog-js'; import Plausible from 'plausible-tracker'; @@ -68,6 +70,10 @@ export const trackEvent = (eventArgs?: string | TrackEventArgs): void => { const data = typeof eventArgs === 'string' ? { path, route } : { ...eventArgs.data, path, route }; + if (browser && shouldForwardAnalyticsToStatsig(name, path)) { + logStatsigCtaEvent(name, data as Record); + } + if (ENV.DEV || ENV.PREVIEW) { console.log(`[Analytics] Event:`, name, data); return; diff --git a/src/lib/layouts/Main.svelte b/src/lib/layouts/Main.svelte index f50482fb4e..4cf735019a 100644 --- a/src/lib/layouts/Main.svelte +++ b/src/lib/layouts/Main.svelte @@ -245,6 +245,7 @@ rel={isOfferPage ? undefined : 'noopener noreferrer'} class="web-u-inline-width-100-percent-mobile" style={isOfferPage ? 'pointer-events: none;' : ''} + event={isOfferPage ? undefined : 'main-github_star_nav-click'} >