{"_id":"@12-apps/observability-frontend","_rev":"21-d59dead2c913c209478d9f5deb121320","name":"@12-apps/observability-frontend","dist-tags":{"latest":"2.4.2"},"versions":{"1.0.0":{"name":"@12-apps/observability-frontend","version":"1.0.0","license":"MIT","_id":"@12-apps/observability-frontend@1.0.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"e1d4391da532ed158806a9114c168991279b3d5d","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-1.0.0.tgz","fileCount":14,"integrity":"sha512-+3VJVoN7oOEC/3ADks/PpHLrBCiExgh88cVJqcKimBdUBn6r3T+7ayyWK3tf9IOcV4yaDfGZbXUMrZlFU4Jnkg==","signatures":[{"sig":"MEUCIQDUh2OLtONHekd5rsVRUjI2R0nI3IUoIFqNq5koU/O19AIgWYXPq0RusnEZSa/uWujQYX9FRckIwlgYl5fQnvMsgK0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79732},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/sentry-sourcemaps.d.ts","default":"./dist/vite/sentry-sourcemaps.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx"},"gitHead":"ec6d74e8ae3156dc9294ef46e3fd05dcdf8b6af4","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"tigredonorte","email":"tigredonorte3@gmail.com"},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@12-apps/ui":"^1.12.0","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.12.1","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.12.1","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_1.0.0_1786117783683_0.3380126093662341","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@12-apps/observability-frontend","version":"1.0.1","license":"MIT","_id":"@12-apps/observability-frontend@1.0.1","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"99d2774b7903a015039f1dd426bd22c5e0873e9a","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-1.0.1.tgz","fileCount":14,"integrity":"sha512-NlZ+gZ7/JBMTPuZdkXy3TxsWTBBlaU+92ghhDMp4kpM9AlfbsWsok9L1TjWelTWPJAPWqSw0TlQL7nJvmaekqQ==","signatures":[{"sig":"MEUCIQD7rzS7R/fo9wBQyv4vBz1kxzp+FsRFMcejCX+9uDHQjgIgLS5yx8Hlz5NxBmiYeVSnmMxnb1Nz7nXIsyyMEIXIrg8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":79732},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/sentry-sourcemaps.d.ts","default":"./dist/vite/sentry-sourcemaps.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx"},"gitHead":"e9fa4d72f92e37490fec1f39348375e9e34bf2ee","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2cae94d2-3085-4824-88bf-c97a203956c8"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@12-apps/ui":"^1.12.1","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.12.2","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.12.2","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_1.0.1_1786127758780_0.1366729725273117","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@12-apps/observability-frontend","version":"1.1.0","license":"MIT","_id":"@12-apps/observability-frontend@1.1.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"abfbfa70c1e418f6463d86a4223cbac43aef7f62","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-1.1.0.tgz","fileCount":20,"integrity":"sha512-pvzKJGApZjG4F6aO1s/L0k3k9NN1WdpJSsAkGMjFCalu9hFPS0ToCVqXUHP6U4HE6L/5JcIgSaMgVs4mbu/Ugg==","signatures":[{"sig":"MEYCIQDVEWJCU4KkIjapl2SzUZROFePKntAK7tFwBkv8kfTVTQIhAKxbjM8q+Bxe19yQZ7Oq1Q/TW8YgSI/SxwLrrbxThNqG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":135894},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"903862a6809118567baa5931596f484c3ff8ff37","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2cae94d2-3085-4824-88bf-c97a203956c8"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@12-apps/ui":"^1.13.0","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.13.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.13.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_1.1.0_1786128569129_0.15030704576963716","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@12-apps/observability-frontend","version":"1.2.0","license":"MIT","_id":"@12-apps/observability-frontend@1.2.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"efbc57007f336761b024364cc775529d055f34e9","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-1.2.0.tgz","fileCount":20,"integrity":"sha512-zlBYxr/0ujpSaGgkrNntQRYcHdbniJ83Vt1RQRIVQGvgkXU5JDTOobj7w7BDEYtLpudmFs/+T4fsHHzFm/3zdQ==","signatures":[{"sig":"MEYCIQCuIj9n5iPWyc5+Db/D7fFYL0YFbwy8XZWlcbhuWjm1sAIhAJen/KMAzMmKC/TPMPHlgmQjjV0QrUzB8mG8b7xCFaT4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":135894},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"f9c9457f43bc8c265f81d27b8d3bb5f250fce11e","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2cae94d2-3085-4824-88bf-c97a203956c8"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@12-apps/ui":"^1.14.0","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.15.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.15.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_1.2.0_1786133045911_0.7378920198537933","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@12-apps/observability-frontend","version":"1.3.0","license":"MIT","_id":"@12-apps/observability-frontend@1.3.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"50648f753ec71bdebbf7c8b274d3d5c6e47bd204","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-1.3.0.tgz","fileCount":20,"integrity":"sha512-TBAtFFv9w9vRqN2CNPhC1boaV/x1RLFrgxgAjSb8t5FLc0LUD4jSTYIqpuQxsw7uZRAeGSIWZVhQeAZgakijYA==","signatures":[{"sig":"MEUCIAaD0IcQI1mDhoR1YRnMKu8JCEdCx4/+Ho5b3CkcRecUAiEAurB3V4XsrhcypZN7W957dQsN/o/rqpLoMkCIyA/nkFQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":135894},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"ebccb7d5693b1f1340342b72139daef11fc81223","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2cae94d2-3085-4824-88bf-c97a203956c8"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@12-apps/ui":"^1.15.0","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.16.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.16.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_1.3.0_1786133764221_0.3021447945418627","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@12-apps/observability-frontend","version":"1.3.1","license":"MIT","_id":"@12-apps/observability-frontend@1.3.1","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"5c08454bbc21849995d45aebe3e21c824d6b6ed7","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-1.3.1.tgz","fileCount":20,"integrity":"sha512-ohwqhwpD98I2AiPmno+2xIHxXfVg8+1I5C1joA2maI6UBwIPPLaGcvEJmUyMNVfV1jLAKgddYa+q3oTqwMTfOA==","signatures":[{"sig":"MEUCIQCmsWQ8Xg8qs0L9H7PAeSunKQ/ZXogEXntKqBnSNUKG0wIgFYNpFKEk1qDDNani+PwfkWYPFfQ7hmrHpHYCNB6GgFA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@1.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":135909},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"bfd39495ffa882cae31b10538877b522984cbebc","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2cae94d2-3085-4824-88bf-c97a203956c8"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@12-apps/ui":"^1.15.1","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.16.2","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.16.2","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_1.3.1_1786138891922_0.8209062883097482","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@12-apps/observability-frontend","version":"1.4.0","license":"MIT","_id":"@12-apps/observability-frontend@1.4.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"208c6f0b21a8614fbc107d3986da031387260000","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-1.4.0.tgz","fileCount":20,"integrity":"sha512-iSoh23PgpxFBIt+3Zx0g/O0NydNVopxc8Z91hF10Sok/Ep+NAfU+NJjkQNySDvi/rsMYTzu7l6cSSiL2r0rsrg==","signatures":[{"sig":"MEUCIDY/mTtrHR8oscTGwXoCMSAuA0arYon1hRIsL+nQE33UAiEA9wgFpHP4afRk9JpeWKuGq11EnD7cFOhaz1qKbPnxA5c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":135909},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"2d4a0e9dbf04f79e2306b779f56f0dd5d079e09a","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2cae94d2-3085-4824-88bf-c97a203956c8"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@12-apps/ui":"^1.16.0","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.17.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.17.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_1.4.0_1786145597433_0.5596229833591402","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@12-apps/observability-frontend","version":"1.4.1","license":"MIT","_id":"@12-apps/observability-frontend@1.4.1","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"faffec53712c292c1e1e98d290139c77268b2d5c","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-1.4.1.tgz","fileCount":20,"integrity":"sha512-d82cG6M/5o0GpzNnH+VVpNTs7aW2oOKxgFNuZfsJWixslCzaBsV388OzA6X9pI/jEmjC22JcGyax9ox4RDo9dA==","signatures":[{"sig":"MEQCIA958Qh6676cWCIh62Uf31jDOZTySe8Ug1W5Tmwcond1AiB0+vrvyk4U9axgKJ46aq9G16KMEp7REAhYHeOvGwLnZg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@1.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":135909},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"f0356169f9682182eabba77485cf4772051235ae","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2cae94d2-3085-4824-88bf-c97a203956c8"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@12-apps/ui":"^1.16.1","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.17.1","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.17.1","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_1.4.1_1786146739400_0.2878496339462484","host":"s3://npm-registry-packages-npm-production"}},"1.4.2":{"name":"@12-apps/observability-frontend","version":"1.4.2","license":"MIT","_id":"@12-apps/observability-frontend@1.4.2","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"e76cafd27e11a28149671ca073d1480fb35a7595","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-1.4.2.tgz","fileCount":20,"integrity":"sha512-B8V1ZKWKDu/RI14/c1KQtIDuZeo6+X62sBQdb4B4YixuViEep8Y/d8Pnnn+W4Xv3boORpQtYIMLsjSvDJBLIaQ==","signatures":[{"sig":"MEQCIB4CeUk1MU0yWeFxkC2Orc/OZw0MRFBvhUWaV5UoV4XFAiB9x+zXLpuTxMeRdN7HWdCaxf/TF4CWBMXgzkaxos2xSQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@1.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":135909},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"4b2466cbe6cded4941ec25ef92cf41d7fab0697e","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2cae94d2-3085-4824-88bf-c97a203956c8"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@12-apps/ui":"^1.16.2","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.17.2","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.17.2","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_1.4.2_1786159997168_0.40192272315495026","host":"s3://npm-registry-packages-npm-production"}},"1.4.3":{"name":"@12-apps/observability-frontend","version":"1.4.3","license":"MIT","_id":"@12-apps/observability-frontend@1.4.3","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"a9b874ecdf4e2d0e88279697be3bd473611c1761","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-1.4.3.tgz","fileCount":20,"integrity":"sha512-kiZnvu5Ah/C5rlK883+ZROtGF3SyRoibXj/Kv0zzq7g9WAAO9btuyi1THr86dd7bdp8fc7xZ4RpoycPvUQijxg==","signatures":[{"sig":"MEUCIQDABd2zGtzPrAyd2uXl+bdJgS4f813ntz/+2IHhZZUb2QIgB6RsCcRI2YIQ+HPJFzXuUZ9429sxRJfMQZ2PJ3+JzrY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@1.4.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":135909},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"ee3399530780d82beea32410802a945627ffe271","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2cae94d2-3085-4824-88bf-c97a203956c8"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@12-apps/ui":"^1.16.3","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.17.3","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.17.3","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_1.4.3_1786197973103_0.47575384107181584","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@12-apps/observability-frontend","version":"1.5.0","license":"MIT","_id":"@12-apps/observability-frontend@1.5.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"b6810af6a44217708bee6663c605a205ebb688de","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-1.5.0.tgz","fileCount":20,"integrity":"sha512-x8vGW8y9WD+bdpJEnMb5JBP/kSFbx5cr04yVdD7NokRgqVHDp9ijQuwvSLuBKouXF7bOEjkrZnIgAz9GEtr/RA==","signatures":[{"sig":"MEYCIQDevySh4uRlXdN0cvY+MpX9o8YA68Wv2CrtB1kbaKEqMwIhAN2XAOrSsccyELJefFf5omSyy3d7mtn1wQnIkBpeJT02","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@1.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":135909},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"8af3c18e1811d042f30016a4ba43e74abc4b8c50","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2cae94d2-3085-4824-88bf-c97a203956c8"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@12-apps/ui":"^1.17.0","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.18.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.18.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_1.5.0_1786203945511_0.5641201586561544","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@12-apps/observability-frontend","version":"1.6.0","license":"MIT","_id":"@12-apps/observability-frontend@1.6.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"23a0e8ecbb3caf74adb617da5b7ef6fa0fb21aee","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-1.6.0.tgz","fileCount":20,"integrity":"sha512-9Es0r894aANTAuy8oxUEiDjGi5P8M4j1ryo7SDpW9Jhyx4cCFdPT27X/v/7XPl2JcHTUOrfmX49EccwdcfYVAg==","signatures":[{"sig":"MEUCIFTLb7t3BkaF5VCYnKabMo9Q2qpCNv0YUMhfvpwEzNVOAiEAhNX2W3d0FjE6/MyWnMdPZXN0o4q9H+RcusT5kTXSFzE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@1.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":135909},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"3a8eb1783f8cccce3b7ec49cb10e3e6d2c5d7310","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2cae94d2-3085-4824-88bf-c97a203956c8"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@12-apps/ui":"^1.18.0","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.19.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.19.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_1.6.0_1786206148293_0.3599997062366247","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@12-apps/observability-frontend","version":"1.7.0","license":"MIT","_id":"@12-apps/observability-frontend@1.7.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"8ef235561d4cd87b3412123527b36314a5bb59c7","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-1.7.0.tgz","fileCount":20,"integrity":"sha512-rKDxI3dljRVGGwL34/AK/EBnEwbDBB/HtBRMiRSbp+21fKSTed3m/9Wxf7tbsY7awhVH7hmdwjvOgGh7m3i9Pg==","signatures":[{"sig":"MEQCIEj3S2Q7uYGW0bgMmmgy+aj7oA4s7zfkukt3xyxKDVNzAiBr/N+XKBwY03opLcKbA7jioVOR0uh/dGRV9wXLXGNryQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@1.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":135909},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"21bbb5b06424cf045eaad617a5912aa00d0c654b","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2cae94d2-3085-4824-88bf-c97a203956c8"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@12-apps/ui":"^1.19.0","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.20.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.20.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_1.7.0_1786209493198_0.8904384461925363","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@12-apps/observability-frontend","version":"2.0.0","license":"MIT","_id":"@12-apps/observability-frontend@2.0.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"f07a5e3cb8c8ce8379680e5487f4caf067fcd83b","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-2.0.0.tgz","fileCount":20,"integrity":"sha512-Qrcxv3dJcwjX69IpcndRu411qiYQN4y3PvZLeON78HgubAzWVoCTOHzEHzb3uEmmR1kJW3S/FzelVc6BbOTZmw==","signatures":[{"sig":"MEQCIHchrTe+yHjyqbCRHS9EKMl2IfoQf03ioS/eFunQE/vXAiAtJXxLZfKXP2WpuK3aM8t6IGpzJ7g7xYAHomFkbOv0mg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":135918},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"f837d4958a5b21e02d2f02a1c008ff1d1a23937a","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2cae94d2-3085-4824-88bf-c97a203956c8"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^5.0.0","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.20.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.20.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_2.0.0_1786800369993_0.5687324098658908","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@12-apps/observability-frontend","version":"2.0.1","license":"MIT","_id":"@12-apps/observability-frontend@2.0.1","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"f8c8c7a5cf1f91a0018861e3e978fb249046f062","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-2.0.1.tgz","fileCount":20,"integrity":"sha512-jht4O9ZRwXq4jbn/F7TYNSKosDmy1kVhf78AzgAzuTcK3BXR4rd4u9ye5777kMgmvcPwvYPTlW1AKuxgEqtkFw==","signatures":[{"sig":"MEQCIHNeMZBJ6FlUbFJfAcLLavKnf0PDUpOk0GAWqz9uyqn6AiBgKqjZDn17IE0g/cbWLK/rbBWsdFGy2GY5ASHAqsIntg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@2.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":135918},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"3c4711049bf8351685612372531c3cae1370bbbb","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2cae94d2-3085-4824-88bf-c97a203956c8"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^6.1.0","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.21.1","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.20.1","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_2.0.1_1787327339431_0.36380225907573505","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@12-apps/observability-frontend","version":"2.1.0","license":"MIT","_id":"@12-apps/observability-frontend@2.1.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"e98fb2db4ffca323bce1a02a14b1151d38ecc2bb","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-2.1.0.tgz","fileCount":20,"integrity":"sha512-phuur1zSUhqL02U9wqSHJyAcOOjXqSdrSyxBvnhTGYCzNosu4qyMX2JFhnuT6r/FdcoBV++sxnl6ZI/c1pG2Ag==","signatures":[{"sig":"MEUCIQCCDt/QpNo2LuPds0eBZ6i5DZPtGnijGzShibz3BxgGpAIgQDdj33tmk/UXaW4kQGvIc/Skr12ZkMjTjz4RfqFKl9o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@2.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":135895},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"cfd1c91f3801fb5da5c39021cd06817f95450e15","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a18a86c-61bc-4d5b-a735-f9bc8a96fe47"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^6.4.0","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.21.1","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.20.1","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_2.1.0_1787473397443_0.5302979744302234","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@12-apps/observability-frontend","version":"2.2.0","license":"MIT","_id":"@12-apps/observability-frontend@2.2.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"a181283da2b9593f3f25feb71320c7615de28c31","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-2.2.0.tgz","fileCount":20,"integrity":"sha512-d51RcaVhUFVAqbzhIorLR8rIzFH+9wEHKq6dKJM+mXdU03i5i4PCn2P5f6RJ8Zo6eWgTu7xS+y0MchDpE0Y32w==","signatures":[{"sig":"MEUCIAOWgkLu/JfpDsaaXkx7OsIfeu8l/rJ8532anMqo28NSAiEAuMYp/7wHiajmmQBb/MZ4XHpna812hY9CwojheNSiLwA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@2.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":135899},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"0de25dd141536e8a17e42bfce2c5aaa5e9608f49","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a18a86c-61bc-4d5b-a735-f9bc8a96fe47"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^6.5.0","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.21.1","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.20.1","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_2.2.0_1787479999723_0.17440181425165258","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@12-apps/observability-frontend","version":"2.3.0","license":"MIT","_id":"@12-apps/observability-frontend@2.3.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"77028baf43ff110aa23b7fa6490a0b08d7b4d808","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-2.3.0.tgz","fileCount":20,"integrity":"sha512-KyFMTuAhdgZokJ7d1/LFJjcFKy5NakbWVi2EkJbFCR/amuCG0j2SeXm6Qxx9GISsHPwc13514pcg4y5RkBFoLg==","signatures":[{"sig":"MEUCIQCBGkfMjKeBykc2eG3JUOhJGGf+3/IMiirQIpCmrPmJSAIgQ3Cm4wk+3ZwfBqEabGaXQHrszGt2a1N1RnnMN+PnibQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@2.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":135924},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"4714bd10c901bcc51544843d5d6091cc1509e649","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2a18a86c-61bc-4d5b-a735-f9bc8a96fe47"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.0.2","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^6.10.0","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.22.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.21.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_2.3.0_1787617926917_0.9722007848606835","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"@12-apps/observability-frontend","version":"2.4.0","license":"MIT","_id":"@12-apps/observability-frontend@2.4.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"7cec200014ca6dccf773ef2fcb531c646cf5e78a","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-2.4.0.tgz","fileCount":23,"integrity":"sha512-8l+FgDtVgUzDzsF7TZ+t7ZtNZLqanzb8KJ8SfCME/6fIg7Pdgz2dg9X7GXhcs0w5CitUKYVdXbprooTn3mIEFQ==","signatures":[{"sig":"MEUCIE6oMnHmvCv+EYnFiBKwGBejzkY+veGvMx1PSySRapUnAiEAojwqYsv5Ok8m/dnuVv30xHAhSJVyqfzIXmEDLNQZo8M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCZkgToyCKnaNk2Fn/UI6IoaIdfSLFobzr93GjU3+6FFgIhAJEF2AaNX64pHGJLbLV3A2h71sn1+cYQ7uhr9khWeGTV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@2.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":146934},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"2d4da2e4eb56f158dccb232d5e68888f83d60cf1","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"2a18a86c-61bc-4d5b-a735-f9bc8a96fe47"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.1.0","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"@12-apps/ui":"^6.53.0","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.22.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.21.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_2.4.0_1790734056231_0.06621126344400086","host":"s3://npm-registry-packages-npm-production"}},"2.4.1":{"name":"@12-apps/observability-frontend","version":"2.4.1","license":"MIT","_id":"@12-apps/observability-frontend@2.4.1","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"8707666b78bc4ba21428df844dc0d4c2c4c934d8","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-2.4.1.tgz","fileCount":23,"integrity":"sha512-dGmqEVkAlZf4iAUT1n1VOa8XD7frXiUPtCFd5oXoSYsWs7mxZRB72pKRzb1ZemwPtacQAR2vb3rjlErM15LJDA==","signatures":[{"sig":"MEUCIADyyIyf7q2JZu/LsuSHTXb7DM4bdWVu1W5ppzCmNrj9AiEArjTEaAhxJ6ZsGJcer4lzO6tifyv8GnlGLJ6tpcrZMH8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDj2M0TyNHBSze8LijJMiocURuGWtutrAOxHBWP/hAVTAiEA7gTuOwdQBeNhrre7nA7OS5wHUzkrkIjUh8fvZmYeE3g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@2.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":149032},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"7ef9db19816ca2da78060fbe58e622110e4b6cb0","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"2a18a86c-61bc-4d5b-a735-f9bc8a96fe47"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.1.0","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"@12-apps/ui":"^6.53.0","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.22.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.21.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/observability-frontend_2.4.1_1790736855907_0.4528598077766395","host":"s3://npm-registry-packages-npm-production"}},"2.4.2":{"_id":"@12-apps/observability-frontend@2.4.2","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"68dd8ad1a570d2f37055a97a4a5bf75355d19a93","tarball":"https://registry.npmjs.org/@12-apps/observability-frontend/-/observability-frontend-2.4.2.tgz","fileCount":27,"integrity":"sha512-JJcV9C9h9lEOSfGaKJ9tdhhq9pTfTQYPfNmBx9t3CCdgdq4P/4J7cy0c8u2w4i4QXNRDKcAd5XxMFYiUfxB8Kw==","signatures":[{"sig":"MEQCIFKI4Pcg9ds3e1OTMm7Va2ymzTU94EhDt4ZKjCbCV7zIAiB2FJvYHHmbcTrHndG88Me38PvjqYNShUhGU+S/5id9Rw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICKdj1hx9zse1EVj0tQAI7ASxvJjWh2Ofmg3BTjDviwHAiEA5puokvItPn7bNivn7AQQ2/tBAKn7Dhcu7X0gWZKwJl0="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fobservability-frontend@2.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":157745},"name":"@12-apps/observability-frontend","type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./vite":{"types":"./dist/vite/index.d.ts","default":"./dist/vite/index.js"},"./react":"./src/react/index.ts","./self-check":"./src/react/self-check.tsx","./service-worker":{"types":"./dist/observability-sw.d.ts","default":"./dist/observability-sw.global.js"}},"gitHead":"407a702d2a023fcd240f201b3433c78266115584","license":"MIT","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage dist","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit"},"version":"2.4.2","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"2a18a86c-61bc-4d5b-a735-f9bc8a96fe47"}},"homepage":"https://github.com/12-apps/shared-packages#readme","repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"_npmVersion":"12.2.0","description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","directories":{},"maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"@12-apps/ui":"^6.56.0","@sentry/react":"^10.69.0","@sentry/vite-plugin":"^5.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^6.4.1","jsdom":"^26.1.0","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"^19.2.0","react-router-dom":"^7.1.1","@12-apps/eslint-config":"^1.22.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.21.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"vite":">=6.0.0","react":">=19.0.0","react-dom":">=19.0.0","react-router-dom":">=7.0.0"},"peerDependenciesMeta":{"vite":{"optional":true},"react-router-dom":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/observability-frontend_2.4.2_1790808597651_0.002462763657043343"}}},"time":{"created":"2026-08-07T15:49:43.499Z","modified":"2026-09-30T22:49:58.185Z","1.0.0":"2026-08-07T15:49:43.919Z","1.0.1":"2026-08-07T18:35:58.935Z","1.1.0":"2026-08-07T18:49:29.295Z","1.2.0":"2026-08-07T20:04:06.102Z","1.3.0":"2026-08-07T20:16:04.372Z","1.3.1":"2026-08-07T21:41:32.077Z","1.4.0":"2026-08-07T23:33:17.579Z","1.4.1":"2026-08-07T23:52:19.561Z","1.4.2":"2026-08-08T03:33:17.316Z","1.4.3":"2026-08-08T14:06:13.229Z","1.5.0":"2026-08-08T15:45:45.680Z","1.6.0":"2026-08-08T16:22:28.427Z","1.7.0":"2026-08-08T17:18:13.333Z","2.0.0":"2026-08-15T13:26:10.125Z","2.0.1":"2026-08-21T15:48:59.609Z","2.1.0":"2026-08-23T08:23:17.567Z","2.2.0":"2026-08-23T10:13:20.023Z","2.3.0":"2026-08-25T00:32:07.076Z","2.4.0":"2026-09-30T02:07:36.333Z","2.4.1":"2026-09-30T02:54:15.996Z","2.4.2":"2026-09-30T22:49:57.791Z"},"bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"license":"MIT","homepage":"https://github.com/12-apps/shared-packages#readme","repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/observability-frontend"},"description":"Browser error reporting for a React SPA, on Sentry: deferred init behind a served DSN, the noise rules that keep a deploy from filing one issue per open tab, a PII scrub, a route error boundary and a self-check page that proves the chain is live in the de","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"readme":"# `@12-apps/observability-frontend`\n\nBrowser error reporting on Sentry — reading what production actually said, on\nthe side of the wire nobody can attach a debugger to.\n\nIt has a server-side counterpart, `@12-apps/observability-backend`. They are two\npackages rather than one because they share no code at all, only environment\nvariables — one side is `@sentry/node` plus `winston-transport`, the other is\n`@sentry/react` plus React, and a single package would put a Winston transport\nin every SPA's dependency tree and React in every server's:\n\n| package | contents |\n| --- | --- |\n| `@12-apps/observability-backend` | a Winston transport that forwards `error`/`warn` on `@sentry/node`, a PII scrub that redacts by key at any depth, and a flush for a deliberate exit |\n| `@12-apps/observability-frontend` | deferred init behind a **served** DSN on `@sentry/react`, the noise rules that keep a deploy from filing one issue per open tab, a stricter PII scrub, a route error boundary, a self-check page, and the Vite source-map upload plugin |\n\nThey are independent — either runs without the other — but they deliberately\nshare `SENTRY_ENVIRONMENT` and `SENTRY_RELEASE`, so a browser event and the 500\nbehind it land in the same environment under the same build.\n\nBoth are host-agnostic: no fetch wrapper, no router assumptions, no product\ncopy, no tenant vocabulary. Everything they cannot know — what a routine API\nerror looks like, what a crashed page should render, where the config lives —\narrives through a named seam the host fills in. See [the seams](#the-seams).\n\nThey were extracted from a working application rather than designed in the\nabstract, so the reasoning below cites the failures they came from. What stays\nin the consuming repo is deployment fact rather than library behaviour: which\nSentry project each app reports to, and how the upload token reaches\n`docker build`.\n\n## Entry points\n\n| import | what it is | pulls in |\n|---|---|---|\n| `@12-apps/observability-frontend` | init, the pre-init buffer, context tags, `beforeSend`, `reportRouteCrash` / `reportWarning` | `@sentry/react` |\n| `@12-apps/observability-frontend/react` | `createRouteErrorBoundary`, `createObservabilityPage` | + React, `react-router-dom` |\n| `@12-apps/observability-frontend/self-check` | the self-check page itself | + `@12-apps/ui` |\n| `@12-apps/observability-frontend/vite` | the two build plugins: source-map upload, and emitting the worker reporter | `@sentry/vite-plugin` (build only) |\n| `@12-apps/observability-frontend/service-worker` | the worker reporter, as a classic script | nothing — self-contained IIFE |\n\nThat split is not cosmetic. The root entry is framework-free, so a worker\nor a non-React host can report without React arriving through a barrel it did\nnot ask for. And the page is reachable only through its own subpath or the\ndynamic `import()` inside the route factory — naming it in the `react` barrel\nwould pull a diagnostic nobody opens into every app's entry chunk.\n\n**Three of these ship in different formats, and none of it is preference.**\nWhat LOADS the code decides what the code must be:\n\n| entry | loaded by | so it ships as |\n|---|---|---|\n| `.` / `/react` / `/self-check` | the consumer's bundler | TypeScript source |\n| `/vite` | **Node** (Vite bundles a config but leaves bare specifiers external) | compiled ESM |\n| `/service-worker` | **`importScripts()`** | a classic script (IIFE) |\n\nNode refuses to strip types below `node_modules`, and `importScripts` cannot\nload an ES module at all — so both of those would fail in every consumer, on\nthe first build after publishing, while working perfectly as a workspace\nsibling where pnpm's symlink puts the realpath outside `node_modules`.\n\n## Wiring an app\n\n### 1. Start it, before the first render, without awaiting it\n\n```ts\n// main.tsx\nimport { startObservability } from \"@12-apps/observability-frontend\";\n\nvoid startObservability(\"storefront\");\n```\n\nThe two halves have opposite timing needs, and the single call gets both right.\nInstalling the global handlers (`window.onerror`, `unhandledrejection`) is\nsynchronous and must precede the first render, or a throw during boot is lost.\nFetching the DSN is a network round-trip and must **not** gate first paint — an\napp that waits on error reporting to draw has made reporting the outage. So the\nhandlers go in immediately and buffer into memory; the buffer drains once the\nSDK is up, or is dropped if reporting turns out to be off.\n\n### 2. Configure the error boundary once, mount it everywhere\n\n```tsx\n// route-error-boundary.tsx\nimport { createRouteErrorBoundary } from \"@12-apps/observability-frontend/react\";\n\nexport const RouteErrorBoundary = createRouteErrorBoundary({\n  fallback: ({ error, reload }) => (\n    <ErrorState message={error.message} onRetry={reload} />\n  ),\n});\n```\n\n```tsx\n// the layout, around the routed outlet\n<RouteErrorBoundary resetKey={location.key}>\n  <Outlet />\n</RouteErrorBoundary>\n```\n\n**Why the boundary is in an observability package at all.** `window.onerror`\nnever sees a render crash — React catches the throw and re-throws it out of\nband — so an app with global handlers but no boundary reports *nothing* for the\none failure mode that blanks the screen. They are two halves of the same\nguarantee, and shipping them apart is how one ends up missing.\n\nTwo things to get right:\n\n- **`resetKey` is the routed location.** Without it the boundary latches: error\n  state is component state, and React keeps rendering the fallback until\n  something clears it, so every later navigation shows the failure of a page the\n  user already left. It deliberately does *not* clear on an unrelated re-render\n   — that would remount a deterministically-crashing page in a loop.\n- **Build it at module scope.** A boundary rebuilt per render is a new component\n  type each time, so React unmounts and remounts everything below it whenever\n  the parent renders.\n\nThe fallback gets `reload` and `reset`. Prefer `reload`: the usual cause of a\ncrashed page is a chunk that stopped existing at the last deploy, and\nre-rendering the same tree cannot fetch a file that is gone.\n\n### 3. Mount the self-check route\n\n```tsx\nimport { createObservabilityPage } from \"@12-apps/observability-frontend/react\";\n\nconst observabilityRoute = createObservabilityPage({\n  boundary: (children) => (\n    <RouteErrorBoundary resetKey=\"self-check\">{children}</RouteErrorBoundary>\n  ),\n});\n\n// …then interpolate it, do not render it:\n<Routes>{observabilityRoute}</Routes>\n```\n\nIt returns a `<Route>` rather than exporting a component because `<Routes>`\nreads its children with `createRoutesFromChildren` instead of rendering them —\na component that *returns* a `<Route>` is ignored in silence.\n\nPass the app's **own** boundary. The page's render-crash button only proves\nsomething if the boundary a real page crash would hit is the one that catches\nit; a boundary the package supplied would test the package.\n\n### 4. Upload source maps at build time\n\n```ts\n// vite.config.ts\nimport { sentrySourcemaps } from \"@12-apps/observability-frontend/vite\";\n\nplugins: [react(), sentrySourcemaps({ project: \"my-frontend\" })],\n```\n\nFalsy — so Vite skips it — unless `SENTRY_AUTH_TOKEN` and `SENTRY_ORG` are both\nset, which keeps local and PR builds working with no secret. It uploads and then\ndeletes the `.map` files, so the `dist` that reaches the web server has none.\n\n### 5. Report from the service worker\n\nA service worker is a separate global scope: the page's `window.onerror`, its\n`unhandledrejection` handler and its route boundary see **nothing** a worker\nthrows. An app can have all of the above wired up and still be blind to the\ncode that decides whether a deploy bricks an installed PWA.\n\nTwo lines in the worker, one plugin in the build:\n\n```ts\n// vite.config.ts\nimport { observabilityServiceWorkerAsset } from \"@12-apps/observability-frontend/vite\";\n\nplugins: [react(), observabilityServiceWorkerAsset()],\n```\n\n```js\n// public/sw.js — the first two lines\nimportScripts(\"/observability-sw.js\");\nobservability.installWorkerReporter({ app: \"storefront\" });\n```\n\nThe plugin emits the reporter into `dist` for production and serves the same\npath from `node_modules` in development — a worker that 404s on its first line\nis a worker nobody can debug, and `public/` is copied verbatim by the build, so\nwriting it there would mean committing a build artifact.\n\nThat wires two global handlers: a throw in a handler arrives as `error`, and a\nrejected promise handed to `waitUntil`/`respondWith` arrives as\n`unhandledrejection`. Failures a worker swallows ON PURPOSE reach neither — the\n`catch(() => undefined)` that stops a failed install leaving a page with no\nworker at all — so report those by hand where they matter:\n\n```js\ncaches.open(SHELL_CACHE)\n  .then((cache) => cache.add(SHELL_URL))\n  .catch((error) => observability.reportWorkerError(error, { handler: \"install\" }));\n```\n\nEvery event is tagged `source: service-worker`, because a worker failure and a\nrender crash want different people looking.\n\n**What it will not report:** a failed request. Offline is a worker's normal\nweather and every caching strategy is built around `fetch` rejecting, so\n`Load failed` / `Failed to fetch` / `NetworkError…` are dropped before any I/O.\nThere is also a cap of 5 events per worker INSTANCE — a handler failing in a\nloop fires hundreds of times a second — and the slot is claimed *before* the\nfirst `await`, since a counter incremented after the send would let every call\nin a tick past the check and cap nothing at all.\n\n**Stacks arrive as text, not frames.** A worker script is served verbatim and\nunminified, so `sw.js:118` in the raw stack is already the answer; hand-writing\na per-browser stack parser inside the code that reports failures is a second\nsurface to get wrong.\n\n## The self-check page\n\nEvery app that mounts it gets `/__observabilidade`: a status panel reading the\n**live** SDK (initialised?, DSN with the key masked, environment, release) and\nthree buttons, one per reporting path.\n\n| button | path exercised |\n|---|---|\n| Quebrar no render | throw during render → boundary → `reportRouteCrash` |\n| Erro no handler | throw in a callback → `window.onerror` → global handler |\n| Enviar warning | `reportWarning` directly, no error involved |\n\n**Why a page and not another test.** Every part of this pipeline is unit-tested\nand all of it can still be dead in production, because what breaks is never a\ncomponent — it is the PAIRING of two of them, and each half looks correct alone.\nThe case that motivated it: for two deploys one SPA uploaded its source maps to\na sibling's Sentry project. Builds were green, uploads succeeded, the config\nendpoint answered 200, and symbolication was broken the whole time. Nothing in\nCI could have said so.\n\nRead it like this: an empty DSN in the panel means the variable never reached\nthe process and no button will send anything; otherwise the event should appear\nwithin seconds, and **its stack must name a `.tsx` file and line**. A minified\nframe means the maps are not paired with this release, which is the failure the\npage exists to surface.\n\nIt sits outside the auth gate deliberately — the moment you most want telemetry\nis when the app is broken, and \"the app is broken\" often includes login. That is\nsafe: the ingest DSN is write-only and ships in every bundle, so anyone wanting\nto burn the quota can already POST to Sentry without this page. A 3s per-tab\nthrottle keeps a leaning finger from becoming a flood, and every event it\nproduces is tagged `self-check` so they filter and delete as a group.\n\n## The seams\n\nSix, and each exists because getting it wrong is silent.\n\n| seam | how the host fills it | what it costs to skip |\n|---|---|---|\n| **app name** | `startObservability(app)`; typed as `string` here, narrow it to a union in the host | nothing, but the union is what makes a typo in `main.tsx` a compile error |\n| **config endpoint** | `startObservability(app, { endpoint })`; defaults to `/api/observability-config` | — |\n| **noise classifiers** | `setErrorClassifiers({ isIgnorableResponse, isStaleChunk })` | the host's routine 4xx and its own chunk-loader errors become issues |\n| **span text rule** | `setSpanTextScrubber(text => …)`, before `startObservability` | on a host whose paths name a tenant, every Web Vitals span carries the tenant in its page name and URL |\n| **crash fallback** | `createRouteErrorBoundary({ fallback, onCrash })` | — |\n| **self-check boundary + lazy wrapper** | `createObservabilityPage({ boundary, lazyComponent })` | the crash button tests a boundary no real page uses |\n\nOne line that is deliberately **not** a seam: the stale-chunk **wordings**.\nChrome, Safari and Vite each phrase a dead chunk differently, and pushing that\nlist across the host boundary means dropping one browser's noise while reporting\nanother's — the same non-bug filed once per Safari user and never once per\nChrome user. Browser wording is browser knowledge, so it stays here in\n`noise.ts`; the host's `isStaleChunk` **stacks on top**, for loaders that throw a\ntyped error instead of a recognisable message.\n\n## It is OFF unless a DSN arrives\n\nNo DSN, no SDK, no network. Dev, CI and every test run stay offline — which is\nalso what stops a suite filling the issue tracker with its own deliberate\nfailures.\n\n### Why the DSN is served rather than baked in\n\nA Vite SPA is a static bundle. `import.meta.env` is inlined at build time, so a\n`VITE_SENTRY_DSN` is frozen at `docker build` and a rotation becomes a rebuild —\nand with a bundle served by a web server with no Node process, there is nothing\nin production to read `process.env` on its behalf either.\n\nSo the browser asks `GET /api/observability-config?app=<app>` on boot. Reading\nenv through a *dynamic* key on the server reports the runtime configuration\nrather than build-time-inlined empties. The endpoint is public and\nunauthenticated on purpose: an ingest DSN is write-only and ships in a bundle\nevery visitor downloads, and it has to answer before a session exists, because\nthe errors most worth catching are on the login screen and the first paint.\n\nThe cost is that the SDK starts a round-trip late, which the synchronous\nhandlers plus the buffer pay for. The only window left uncovered is \"the browser\ncould not fetch the entry bundle at all\", which no in-page reporter catches.\n\n## Field Web Vitals — only when the config serves a rate\n\nThe config endpoint may also answer `tracesSampleRate`, a number from 0 to 1.\nAbsent means 0, so an older backend keeps errors on and performance off; a\npresent but malformed value rejects the whole config rather than guessing.\n\nWith a rate above 0:\n\n- **Every span leaves through `beforeSendSpan`.** `traceLifecycle: \"stream\"` is\n  a client option, not a per-integration one. Streamed spans never reach\n  `beforeSendTransaction`, so that one hook, wrapped in `withStreamedSpan`, is\n  where the PII rules below run for spans, as `beforeSend` is for errors. It is\n  installed on the live client options together with the vitals, before the\n  integrations that make spans, so the scrub is not on the critical path either.\n- **The vitals integrations load after `load`.** `webVitalsIntegration` and\n  `spanStreamingIntegration` come in through a dynamic import once the page has\n  loaded. Measuring the first paint must not delay it. The host's bundler has to\n  keep that chunk lazy: a `manualChunks` rule that pulls every `@sentry` module\n  into one eager chunk pulls these in too.\n- **A span names a page three ways:** its `name`, the `sentry.transaction` and\n  `sentry.segment.name` attributes, and any `*.url` attribute a vital points at.\n  URLs go through `scrubUrl()` first. Then the host's `setSpanTextScrubber` rule\n  runs on the names and on each URL's PATH (never its origin). This package\n  cannot know which path segment names a tenant, so it defaults to no rule.\n\n## Noise — what must never become an issue\n\nA reporter that shouts on every deploy is muted in its first week, and a muted\nreporter still bills. All of it happens in one `beforeSend`, so it applies to\nevents the SDK's own instrumentation raises as well as to hand-captured ones.\n\n1. **Stale chunks after a deploy.** Every hashed filename dies with the deploy\n   that produced it, so every tab opened beforehand asks for a chunk that is\n   gone. Dropped everywhere *except* at the route boundary: a host loader that\n   reloads once has already swallowed the first failure, so a chunk error that\n   reaches the boundary survived that recovery and is worth a look.\n2. **A routine non-5xx answer.** Whatever the host's fetch layer throws for a\n   `400` looks exactly like a crash. `isIgnorableResponse` is how it says\n   otherwise; a 5xx still passes.\n3. **Code that is not ours.** `ResizeObserver loop …`, the opaque cross-origin\n   `Script error.` (no stack, no file — it groups everything unrelated under one\n   heading), and stacks pointing into browser extensions.\n\n## PII\n\nAn SPA's exposure is ordinary rather than exceptional: a checkout screen holds\nthe payer's name, e-mail, tax id and card fields in React state and in the DOM,\nwithin reach of any automatic breadcrumb. A URL is evidence by itself.\n\n1. **`scrub()`** redacts by KEY at any depth, normalising case and separators so\n   `taxId` / `tax_id` / `TaxID` are one entry. By key rather than by value shape:\n   a Brazilian CPF is eleven digits, and so are plenty of ids worth keeping.\n   Order ids, charge ids and amounts survive on purpose — a scrub that eats them\n   leaves every event undiagnosable.\n2. **`scrubUrl()`** keeps the path and drops the query string and fragment. The\n   path is what makes an event triageable; the query string is where tokens and\n   a `?next=` e-mail end up.\n3. **`sendDefaultPii: false`**, held off regardless of DSN, so request bodies,\n   cookies and IPs never ride along.\n4. **No Session Replay.** A replay of a checkout crash is a recording of\n   someone's card. Turning it on is a separate decision that needs masking\n   configured first.\n\n`setObservabilityContext` takes a narrow object rather than a user, so the tags\nstay to the set that makes an event triageable without identifying anyone. It\nwrites only the keys actually passed — independent components set context from\ndifferent places, and if both wrote every key the later effect would silently\noverwrite the earlier one in an order neither controls.\n\n## Tests\n\n```bash\npnpm --filter \"@12-apps/observability-*\" test\n```\n\nThey run on jsdom with `@sentry/react` mocked, so nothing reaches the network.\n","readmeFilename":"README.md"}