{"_id":"@testa-soft/next","_rev":"29-962e8425bae73fd832cdfabcb2686f67","name":"@testa-soft/next","dist-tags":{"dev":"1.4.0-dev.0","latest":"1.5.0"},"versions":{"0.0.1-dev.0":{"name":"@testa-soft/next","version":"0.0.1-dev.0","license":"UNLICENSED","_id":"@testa-soft/next@0.0.1-dev.0","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"aa15db929dd9f0d2429a1b94112d1dcd619e7e9e","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-0.0.1-dev.0.tgz","fileCount":22,"integrity":"sha512-8ZdaNJwsDWZDrB84QwlouOkzYRrrf0jRnWNWufXGaaAhn3IrPVepLhBbNo3NJx4P1b4mh62LotjAXxK981V1uQ==","signatures":[{"sig":"MEQCIF3c9/4fQsWw/iGMrqFblVylwk4b1ju2bYmIXVHCUXN9AiBGjMTXCEFX1IpDxbk4wTBUJL+2UR7eIVVetp7EZRR3lg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":236697},"main":"./dist/index.cjs","type":"module","_from":"file:testa-soft-next-0.0.1-dev.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/private/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/fd8d17dabedeeb7a1f230e0a6539c65a/testa-soft-next-0.0.1-dev.0.tgz","_integrity":"sha512-8ZdaNJwsDWZDrB84QwlouOkzYRrrf0jRnWNWufXGaaAhn3IrPVepLhBbNo3NJx4P1b4mh62LotjAXxK981V1uQ==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"0.0.1-dev.0","@testa-soft/experiment-core":"0.0.1-dev.0"},"publishConfig":{"tag":"dev-master","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","typescript":"5.6.3","@types/react":"18.3.12","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_0.0.1-dev.0_1786996364911_0.5790413606782003","host":"s3://npm-registry-packages-npm-production"}},"0.0.2-dev.0":{"name":"@testa-soft/next","version":"0.0.2-dev.0","license":"UNLICENSED","_id":"@testa-soft/next@0.0.2-dev.0","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"1bf8b85d89737170b66533e684a6b0df90f742f2","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-0.0.2-dev.0.tgz","fileCount":22,"integrity":"sha512-n0N2/LkMv/9K3N3EyQb+ULvopB5ekyUKRmaS131DEzskM2oqXcgu770n3HFalmdqD6eUlgF8etA+G511drOnDg==","signatures":[{"sig":"MEUCIQCnp77C1gD9XvAHZWLqtUGAtaRxg8ZzwagsvzNOP2wA5QIgQgbTaCwXnWJLjGeyoFNRgwpzeL2Eiye57ZTjk7vCuII=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":205503},"main":"./dist/index.cjs","type":"module","_from":"file:testa-soft-next-0.0.2-dev.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/private/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/2ee2e093d8af3518a0e6c77b1ca93fee/testa-soft-next-0.0.2-dev.0.tgz","_integrity":"sha512-n0N2/LkMv/9K3N3EyQb+ULvopB5ekyUKRmaS131DEzskM2oqXcgu770n3HFalmdqD6eUlgF8etA+G511drOnDg==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"0.0.2-dev.0","@testa-soft/experiment-core":"0.0.2-dev.0"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","typescript":"5.6.3","@types/react":"18.3.12","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_0.0.2-dev.0_1787029119562_0.8715621975260419","host":"s3://npm-registry-packages-npm-production"}},"0.0.2-dev.2":{"name":"@testa-soft/next","version":"0.0.2-dev.2","license":"UNLICENSED","_id":"@testa-soft/next@0.0.2-dev.2","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"1b62d8b6a5829d339f50a0794f8be53a013d000b","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-0.0.2-dev.2.tgz","fileCount":22,"integrity":"sha512-RWqGIlz1BvepammoHgoLlQE6sO1sZ2s65r3vIwOyJATgjngd2de059rF1A0ueDZYcpkdJ014s4d2yzSFwqCRXw==","signatures":[{"sig":"MEYCIQC6vPPiy3bYtiiLWeL9B8vgHsnL35HJi8gmXX6mR9q4EQIhAK/yE3pB/i31dSmPzxqFxVwY63RaQS6a1oR0bKQMvce2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208992},"main":"./dist/index.cjs","type":"module","_from":"file:testa-soft-next-0.0.2-dev.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/private/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/e130807d4d05a9914fabea4c411a5954/testa-soft-next-0.0.2-dev.2.tgz","_integrity":"sha512-RWqGIlz1BvepammoHgoLlQE6sO1sZ2s65r3vIwOyJATgjngd2de059rF1A0ueDZYcpkdJ014s4d2yzSFwqCRXw==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"0.0.2-dev.0","@testa-soft/experiment-core":"0.0.2-dev.2"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","typescript":"5.6.3","@types/react":"18.3.12","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_0.0.2-dev.2_1787048470349_0.26619040916673264","host":"s3://npm-registry-packages-npm-production"}},"0.0.2-dev.3":{"name":"@testa-soft/next","version":"0.0.2-dev.3","license":"UNLICENSED","_id":"@testa-soft/next@0.0.2-dev.3","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"aa706811c999fad2456df5c943a7bed669e2d3df","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-0.0.2-dev.3.tgz","fileCount":22,"integrity":"sha512-rKC3x9EMV/XbG+TtONVLijJbCMtH1qjpkVMeI07iQp2K6uB2as5LSTZZizxvhStBU77muLUmWCIv+/fAEmsKVg==","signatures":[{"sig":"MEUCIQC/1TT42nWrDtGCCR5uath8MFSZY8s5VdfDjJcaw645ggIgcdEpjxzWRAbwwWT1gYKFwt2VfUVtbPghnFGOZH3Pc8o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208992},"main":"./dist/index.cjs","type":"module","_from":"file:testa-soft-next-0.0.2-dev.3.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/private/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/cc9581859f6441305ed37b8a4e6ae2f8/testa-soft-next-0.0.2-dev.3.tgz","_integrity":"sha512-rKC3x9EMV/XbG+TtONVLijJbCMtH1qjpkVMeI07iQp2K6uB2as5LSTZZizxvhStBU77muLUmWCIv+/fAEmsKVg==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"0.0.2-dev.0","@testa-soft/experiment-core":"0.0.2-dev.2"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","typescript":"5.6.3","@types/react":"18.3.12","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_0.0.2-dev.3_1787051129144_0.10210433174331213","host":"s3://npm-registry-packages-npm-production"}},"0.0.2-dev.4":{"name":"@testa-soft/next","version":"0.0.2-dev.4","license":"UNLICENSED","_id":"@testa-soft/next@0.0.2-dev.4","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"89d6b7e436ea6275307443123e1bdac91e3ca5a9","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-0.0.2-dev.4.tgz","fileCount":22,"integrity":"sha512-fmhkt+NH1OcDnhnnuYQJ1qS5XZ/gSDyg4kDx6oe14HEuCmJ7c5gznySlCPxjR1yVaA4hOlsrYbdcFFseyxkI4g==","signatures":[{"sig":"MEQCIGNaIqbqUdUsd3Aw8vF71UZJehw/t4lc9nS+aNJdfZKwAiB6NUZHQLlcBgdjuuLr+wRgNte3EoSUwJoOTuVF+hJH7g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":213423},"main":"./dist/index.cjs","type":"module","_from":"file:testa-soft-next-0.0.2-dev.4.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/private/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/82b2ba28a9f92a519dad71e67b445aff/testa-soft-next-0.0.2-dev.4.tgz","_integrity":"sha512-fmhkt+NH1OcDnhnnuYQJ1qS5XZ/gSDyg4kDx6oe14HEuCmJ7c5gznySlCPxjR1yVaA4hOlsrYbdcFFseyxkI4g==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"0.0.2-dev.0","@testa-soft/experiment-core":"0.0.2-dev.4"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","typescript":"5.6.3","@types/react":"18.3.12","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_0.0.2-dev.4_1787148984340_0.5321815014080098","host":"s3://npm-registry-packages-npm-production"}},"0.0.2-dev.6":{"name":"@testa-soft/next","version":"0.0.2-dev.6","license":"UNLICENSED","_id":"@testa-soft/next@0.0.2-dev.6","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"16fb9ffbfe514fd7a8de061aeaa275989da6bb68","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-0.0.2-dev.6.tgz","fileCount":22,"integrity":"sha512-CkoFTkPHsep8wolIMVrtS1D/ATSKQVPKl9fKlFTjD0jLT5+d2FfSbjdIVcKbRRmFBSmbs+ai89wghEaGIiN9HA==","signatures":[{"sig":"MEYCIQDlxQqWDP9ZpWyRbVWT/yBu5PN3jmsuGGV83JfyLmKVxgIhAOC8aTXfqNU6pJ6vWVTQVBlkHps1NsrPzB81cCqpKuPe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":223842},"main":"./dist/index.cjs","type":"module","_from":"file:testa-soft-next-0.0.2-dev.6.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/private/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/8b868a445de3c6532a23dcb62fdc54dc/testa-soft-next-0.0.2-dev.6.tgz","_integrity":"sha512-CkoFTkPHsep8wolIMVrtS1D/ATSKQVPKl9fKlFTjD0jLT5+d2FfSbjdIVcKbRRmFBSmbs+ai89wghEaGIiN9HA==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"0.0.2-dev.6","@testa-soft/experiment-core":"0.0.2-dev.6"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","typescript":"5.6.3","@types/react":"18.3.12","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_0.0.2-dev.6_1787152238551_0.7280984516778404","host":"s3://npm-registry-packages-npm-production"}},"0.0.2-dev.7":{"name":"@testa-soft/next","version":"0.0.2-dev.7","license":"UNLICENSED","_id":"@testa-soft/next@0.0.2-dev.7","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"5c16f1f400046757522a081769d8cc739224211d","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-0.0.2-dev.7.tgz","fileCount":30,"integrity":"sha512-9gbYRgU9IMmkaU4qnJpDpLjQi8ORzPraSeO0FDVYXvkCX55eWOJx806VUqy9fVlxhz5N1O3LzzLyrCSfXjMH5Q==","signatures":[{"sig":"MEQCIAYgHvfzg2Wm0d1jRuaE/oZ0vwRGJ0xXBxEh8julTROnAiAp7SrPIeg7+ZobWOptEt64+MydNNLKs9w1w6xfo6/ZxA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":264509},"main":"./dist/index.cjs","type":"module","_from":"file:testa-soft-next-0.0.2-dev.7.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/private/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/f74bae9731c98cbd76d110bb71781b18/testa-soft-next-0.0.2-dev.7.tgz","_integrity":"sha512-9gbYRgU9IMmkaU4qnJpDpLjQi8ORzPraSeO0FDVYXvkCX55eWOJx806VUqy9fVlxhz5N1O3LzzLyrCSfXjMH5Q==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"0.0.2-dev.6","@testa-soft/experiment-core":"0.0.2-dev.6"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","typescript":"5.6.3","@types/react":"18.3.12","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_0.0.2-dev.7_1787156123652_0.4073446286575313","host":"s3://npm-registry-packages-npm-production"}},"0.0.2-dev.8":{"name":"@testa-soft/next","version":"0.0.2-dev.8","license":"UNLICENSED","_id":"@testa-soft/next@0.0.2-dev.8","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"8e65d0331efb9919fc7e93c8cb88647843d09b66","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-0.0.2-dev.8.tgz","fileCount":30,"integrity":"sha512-N00tSSLZG7D+8a4uomImWw7HFqFfIWUxtrjsxrpggUZkI/ecd7byAnRh/YozdQxZM1O/E6RUOI04RDzgG7CBCg==","signatures":[{"sig":"MEUCIQDNBAAVAGdUsvrrlpo5a+bt2JgDu911rJEFtYLJ9/op7wIgFSQwjdCGIVj+S22zNyNdRmsT42z0ghXYyBdRg5YEGTM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":266525},"main":"./dist/index.cjs","type":"module","_from":"file:testa-soft-next-0.0.2-dev.8.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/private/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/d230ee20339f99016c0e26c3330f5c7b/testa-soft-next-0.0.2-dev.8.tgz","_integrity":"sha512-N00tSSLZG7D+8a4uomImWw7HFqFfIWUxtrjsxrpggUZkI/ecd7byAnRh/YozdQxZM1O/E6RUOI04RDzgG7CBCg==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"0.0.2-dev.8","@testa-soft/experiment-core":"0.0.2-dev.8"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","typescript":"5.6.3","@types/react":"18.3.12","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_0.0.2-dev.8_1787176229772_0.04207365250282691","host":"s3://npm-registry-packages-npm-production"}},"0.0.2-dev.9":{"name":"@testa-soft/next","version":"0.0.2-dev.9","license":"UNLICENSED","_id":"@testa-soft/next@0.0.2-dev.9","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"a4ce405b3d315e1a12c604fe2de28b3b7dda1682","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-0.0.2-dev.9.tgz","fileCount":30,"integrity":"sha512-SqO3fANdiplKjXGz/qzTHFmJzq5nMqi//t1sDlEvVb20sEgZhCeB2ARqmDrPIFjk3DrAwzR7vGTz97N7RDnQKg==","signatures":[{"sig":"MEUCIEf7aWyuT9QTRqgnQVznvqyZdjPQJF674yZr3dUMrmF6AiEAsSvUceWDy0IRn61i1bXau4uPemInZBgxr+39YwVFhR8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":269980},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.NPBhCeT2m5/testa-soft-next-0.0.2-dev.9.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.NPBhCeT2m5/testa-soft-next-0.0.2-dev.9.tgz","_integrity":"sha512-SqO3fANdiplKjXGz/qzTHFmJzq5nMqi//t1sDlEvVb20sEgZhCeB2ARqmDrPIFjk3DrAwzR7vGTz97N7RDnQKg==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"0.0.2-dev.9","@testa-soft/experiment-core":"0.0.2-dev.9"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","typescript":"5.6.3","@types/react":"18.3.12","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_0.0.2-dev.9_1787178558232_0.3621184838966651","host":"s3://npm-registry-packages-npm-production"}},"0.0.2-dev.10":{"name":"@testa-soft/next","version":"0.0.2-dev.10","license":"UNLICENSED","_id":"@testa-soft/next@0.0.2-dev.10","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"bb7c7814b7a7d06f9355eabc63facd81b55976ed","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-0.0.2-dev.10.tgz","fileCount":30,"integrity":"sha512-C8KPpHDBiQnTZ+D2yVm1BXUbqxbvqa89D5Pf2vrUyujmLjVtPl3akQHtLD6U+9MRFy2Zdbz5t541zXZvYMrBcA==","signatures":[{"sig":"MEUCIGL56a27xFp2oNYHL11n4aX5fytPOP1pUq6IGyMaRb9nAiEA8caOTyj97HzisKLjQrwQ7rpNNu436527UZnQYx5cCWw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":287373},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.3ERP8AYePD/testa-soft-next-0.0.2-dev.10.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.3ERP8AYePD/testa-soft-next-0.0.2-dev.10.tgz","_integrity":"sha512-C8KPpHDBiQnTZ+D2yVm1BXUbqxbvqa89D5Pf2vrUyujmLjVtPl3akQHtLD6U+9MRFy2Zdbz5t541zXZvYMrBcA==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"0.0.2-dev.10","@testa-soft/experiment-core":"0.0.2-dev.10"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","typescript":"5.6.3","@types/react":"18.3.12","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_0.0.2-dev.10_1787213498191_0.759720445377736","host":"s3://npm-registry-packages-npm-production"}},"0.0.2-dev.11":{"name":"@testa-soft/next","version":"0.0.2-dev.11","license":"UNLICENSED","_id":"@testa-soft/next@0.0.2-dev.11","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"66a7df8f08979f0e2cdd60b193dda63eaea1dd91","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-0.0.2-dev.11.tgz","fileCount":30,"integrity":"sha512-NbMn16BwL4MSAWVmFBGhJZz1zyZZ3RayFszFrHBgyP8+lZFx5iWF7c1NGYYQjhhiVitjkqWL+M+7YJ2B0O13ow==","signatures":[{"sig":"MEUCIQCVbYl6N3HipkAkZuGqVJEpasEeB01JqN4SQCaDR7EkPAIgf7+Xezw8f+lTJ/LvF29A+HEJ0h6C93XbcJOoxOjUW6U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":287373},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.5NWGYOUY7F/testa-soft-next-0.0.2-dev.11.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.5NWGYOUY7F/testa-soft-next-0.0.2-dev.11.tgz","_integrity":"sha512-NbMn16BwL4MSAWVmFBGhJZz1zyZZ3RayFszFrHBgyP8+lZFx5iWF7c1NGYYQjhhiVitjkqWL+M+7YJ2B0O13ow==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"0.0.2-dev.11","@testa-soft/experiment-core":"0.0.2-dev.11"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","typescript":"5.6.3","@types/react":"18.3.12","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_0.0.2-dev.11_1787218595396_0.952696782283216","host":"s3://npm-registry-packages-npm-production"}},"0.0.2-dev.12":{"name":"@testa-soft/next","version":"0.0.2-dev.12","license":"UNLICENSED","_id":"@testa-soft/next@0.0.2-dev.12","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"e5b1cb3bfdb990c2e49d61e8100ff84e17cf943b","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-0.0.2-dev.12.tgz","fileCount":30,"integrity":"sha512-8moJEjQ1Jv7ZtpCGTWfK6lxWx9cvV6DHtY+V+isNJVlGoJk0IHgW6lJOAv3m3XxzC9F3DptE52cpYlXMzoVg6w==","signatures":[{"sig":"MEUCIQD2JkDBehA4LuT5ClDpUqIQpokuHJEwCr2pHgMy70OcCgIgQnFF4o5Sk6tBmyY80UG7Uw6ONI9b/4S1nlS8fMt6bRU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":288243},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.3nHz41uS21/testa-soft-next-0.0.2-dev.12.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.3nHz41uS21/testa-soft-next-0.0.2-dev.12.tgz","_integrity":"sha512-8moJEjQ1Jv7ZtpCGTWfK6lxWx9cvV6DHtY+V+isNJVlGoJk0IHgW6lJOAv3m3XxzC9F3DptE52cpYlXMzoVg6w==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"0.0.2-dev.12","@testa-soft/experiment-core":"0.0.2-dev.12"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","typescript":"5.6.3","@types/react":"18.3.12","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_0.0.2-dev.12_1787223444591_0.3747206546367692","host":"s3://npm-registry-packages-npm-production"}},"0.0.2-dev.13":{"name":"@testa-soft/next","version":"0.0.2-dev.13","license":"UNLICENSED","_id":"@testa-soft/next@0.0.2-dev.13","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"f16fc2d17a9c1a56148e162cf3c0151c1fb38d6e","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-0.0.2-dev.13.tgz","fileCount":30,"integrity":"sha512-5FjkcTRPAkM7bhgXmZn0up5oC+81K9U/Bs40MRlg4F0wLlKLIKWUpfqbHq1Feb8zNt/LXBMLcq+RspF2YTgN1w==","signatures":[{"sig":"MEYCIQDEhQv2Mw57Mv6VvXt0HHeKzMlqISoKGEOpymA+rJr/HQIhAOUUU3uBzF+F4ljA1rGUHC+TEv6Te4RxqG4WUnOtW4Nu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":306497},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.thMNfRHTLR/testa-soft-next-0.0.2-dev.13.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.thMNfRHTLR/testa-soft-next-0.0.2-dev.13.tgz","_integrity":"sha512-5FjkcTRPAkM7bhgXmZn0up5oC+81K9U/Bs40MRlg4F0wLlKLIKWUpfqbHq1Feb8zNt/LXBMLcq+RspF2YTgN1w==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"0.0.2-dev.13","@testa-soft/experiment-core":"0.0.2-dev.13"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","typescript":"5.6.3","@types/react":"18.3.12","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_0.0.2-dev.13_1787225944793_0.0484190850752364","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@testa-soft/next","version":"1.1.0","license":"UNLICENSED","_id":"@testa-soft/next@1.1.0","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"6139afa66afc78a7f1fd0c0d7caa7cbdafbd266d","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-1.1.0.tgz","fileCount":30,"integrity":"sha512-wHtlkOrdrF8t8+i2Xr8DOXF4y/54NvgoUCnGVufPvZIf1j2OXo/t1+90J/XRTXWYhqeBpP2dVcXoDJ4apob3Sw==","signatures":[{"sig":"MEUCIDkuzjdZwpLXTXwl0NwYBCmSL0ZM1i5Xl8EtpbWB7S2hAiEA5zyU6htu8/WxYI87X7W+XiILd2IDn+EI1QBIYZ+gxvE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":359565},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.eTKgyY1ljH/testa-soft-next-1.1.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.eTKgyY1ljH/testa-soft-next-1.1.0.tgz","_integrity":"sha512-wHtlkOrdrF8t8+i2Xr8DOXF4y/54NvgoUCnGVufPvZIf1j2OXo/t1+90J/XRTXWYhqeBpP2dVcXoDJ4apob3Sw==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"1.1.0","@testa-soft/experiment-core":"1.1.0"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","typescript":"5.6.3","@types/react":"18.3.12","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_1.1.0_1787234741972_0.11841143368071672","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@testa-soft/next","version":"1.2.0","license":"UNLICENSED","_id":"@testa-soft/next@1.2.0","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"92436aae2b3a16e1ce1d11873c2994266c0cc0c4","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-1.2.0.tgz","fileCount":30,"integrity":"sha512-e0sMQeIngPkbp2+N+7vcYWaGQG2O7qx8rxUyP0NAesiKDOXXww6Ys2NKL7vYWKq2FsJORtupEbhq1/FBlRAW3g==","signatures":[{"sig":"MEUCIHMMMZQRXibv184Wt4qbvbu4sfANQbRCd5QhHQOL+IsnAiEAooKwG1+y3OTdPtcAGEfDUbL3LmVBtXBEdP33ERE0ZZI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":428171},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.jJMP4U4rTY/testa-soft-next-1.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.jJMP4U4rTY/testa-soft-next-1.2.0.tgz","_integrity":"sha512-e0sMQeIngPkbp2+N+7vcYWaGQG2O7qx8rxUyP0NAesiKDOXXww6Ys2NKL7vYWKq2FsJORtupEbhq1/FBlRAW3g==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"1.2.0","@testa-soft/experiment-core":"1.2.0"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","typescript":"5.6.3","@types/react":"18.3.12","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_1.2.0_1787295634640_0.1133754004431129","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@testa-soft/next","version":"1.2.1","license":"UNLICENSED","_id":"@testa-soft/next@1.2.1","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"98c7c6fe5e8b3368f8c118d969df76234619e169","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-1.2.1.tgz","fileCount":30,"integrity":"sha512-s0HjkLN+qF2ehFv47VtAbTew+tcbJvIQwjHH9a2+8cKEXoHCO9VwPkwpJHMIYvNR4HKDefwmkUCgVdvpmG3ddA==","signatures":[{"sig":"MEQCIBxgajTeBEGuApKrJRRXoWoNmOiLjzBqXGo0v2U6CdlIAiBx4KRMYZ44xHPOFJWCbm+vRd0TdRXwnJwsvZHJV0Nyew==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":455103},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.o8lyMyjDJ2/testa-soft-next-1.2.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"},"./_internal/experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs && node scripts/verify-dist.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.o8lyMyjDJ2/testa-soft-next-1.2.1.tgz","_integrity":"sha512-s0HjkLN+qF2ehFv47VtAbTew+tcbJvIQwjHH9a2+8cKEXoHCO9VwPkwpJHMIYvNR4HKDefwmkUCgVdvpmG3ddA==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"1.2.1","@testa-soft/experiment-core":"1.2.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","typescript":"5.6.3","@types/react":"18.3.12","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_1.2.1_1787561930085_0.09161266602565354","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@testa-soft/next","version":"1.3.0","license":"UNLICENSED","_id":"@testa-soft/next@1.3.0","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"fb6bc7b6223a22fa27187fc80924b21823ec631a","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-1.3.0.tgz","fileCount":34,"integrity":"sha512-10XaNWjIIuUkeIpBFjqeX2F1uwacYPRYY1XU6XBdhIltSZR3aeyfXrdjPA21fqIHqg5QShFDQ+3j8Mzjy9CtRA==","signatures":[{"sig":"MEYCIQCdDmSnXDS6LReo58SHftKgTfc5CP/FiVxwnQxrfSXbpQIhAIpQVUV13jqCrCpyAQNLr+Jc53wYuqmAGowCaza6sGIp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":513811},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.KHOcysanUB/testa-soft-next-1.3.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pages":{"types":"./dist/router-pages/index.d.ts","import":"./dist/router-pages/index.js","require":"./dist/router-pages/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"},"./_internal/experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs && node scripts/verify-dist.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.KHOcysanUB/testa-soft-next-1.3.0.tgz","_integrity":"sha512-10XaNWjIIuUkeIpBFjqeX2F1uwacYPRYY1XU6XBdhIltSZR3aeyfXrdjPA21fqIHqg5QShFDQ+3j8Mzjy9CtRA==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"1.3.0","@testa-soft/react":"1.3.0","@testa-soft/experiment-core":"1.3.0"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","react-dom":"18.3.1","typescript":"5.6.3","@types/react":"18.3.12","@types/react-dom":"18.3.1","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_1.3.0_1787640331952_0.1812286647576331","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@testa-soft/next","version":"1.3.1","license":"UNLICENSED","_id":"@testa-soft/next@1.3.1","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"db0c9c877a3a61f00de08f96c670dce74a22adcd","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-1.3.1.tgz","fileCount":34,"integrity":"sha512-NSAz+G/kG8/FNBMsZikGoFD5MHJL0IyAbQO/yy40ma4TucNh9Dlkl4oE3BM2k+RFXLHxOSr8rhZPfL3ibOAW/A==","signatures":[{"sig":"MEYCIQC+Q+b2FFNSiTNtyjkxNPNIxOlazwoxADce1wlG334JfwIhAMryb7mQOn+egwn9siJ1mxBMLh8vc1NYw73icrz4nRpn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":544550},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.AUqd7PDnKR/testa-soft-next-1.3.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pages":{"types":"./dist/router-pages/index.d.ts","import":"./dist/router-pages/index.js","require":"./dist/router-pages/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"},"./_internal/experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs && node scripts/verify-dist.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.AUqd7PDnKR/testa-soft-next-1.3.1.tgz","_integrity":"sha512-NSAz+G/kG8/FNBMsZikGoFD5MHJL0IyAbQO/yy40ma4TucNh9Dlkl4oE3BM2k+RFXLHxOSr8rhZPfL3ibOAW/A==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"1.3.1","@testa-soft/react":"1.3.1","@testa-soft/experiment-core":"1.3.1"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","react-dom":"18.3.1","typescript":"5.6.3","@types/react":"18.3.12","@types/react-dom":"18.3.1","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_1.3.1_1787659037568_0.8609518310632533","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@testa-soft/next","version":"1.3.2","license":"UNLICENSED","_id":"@testa-soft/next@1.3.2","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"c78526f17eaf325a979938f3b9f81f97fdf7d02f","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-1.3.2.tgz","fileCount":34,"integrity":"sha512-kjvRWxO43VcAaGIlfqobf/uvx4Py4MwjCeBqWpEw8Kjt0dMDduyLeXAXknIMCC2U8zYw+Y6rqp2ppZtEK/0G9g==","signatures":[{"sig":"MEQCIBZfk2N9Ngo3aI3Rc0g93EY3coKlvGdW9SLU1bM/Y4NAAiAs8LxaKvdIcwKHRgb4xvlMOl/e4JspVqa3gTbpTQYyVA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":566344},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.hisSbzH5DQ/testa-soft-next-1.3.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pages":{"types":"./dist/router-pages/index.d.ts","import":"./dist/router-pages/index.js","require":"./dist/router-pages/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"},"./_internal/experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs && node scripts/verify-dist.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.hisSbzH5DQ/testa-soft-next-1.3.2.tgz","_integrity":"sha512-kjvRWxO43VcAaGIlfqobf/uvx4Py4MwjCeBqWpEw8Kjt0dMDduyLeXAXknIMCC2U8zYw+Y6rqp2ppZtEK/0G9g==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"1.3.2","@testa-soft/react":"1.3.2","@testa-soft/experiment-core":"1.3.2"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","react-dom":"18.3.1","typescript":"5.6.3","@types/react":"18.3.12","@types/react-dom":"18.3.1","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_1.3.2_1787660753532_0.38604791306964814","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"@testa-soft/next","version":"1.3.3","license":"UNLICENSED","_id":"@testa-soft/next@1.3.3","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"98c947a91d84859f99d890eff512c8ada378f4d5","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-1.3.3.tgz","fileCount":34,"integrity":"sha512-yz0LpOEbQIhHulKzhr6NYsl1aTBFoN92mhMC51g2I0umNKl+Y0yvgsU6H1kQ+ZgCD3hjxoz0DJdsiTo3bfc/MA==","signatures":[{"sig":"MEUCIDMWw8iMTnTkw9yPkjZFCvHQUAsD83AZYdWa6FAdxzvqAiEAs5XAq2DW3ZhpFSmNpj+0RFpN3k96hb2MTntjn+7ojKs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":641808},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.5wp4NbusZa/testa-soft-next-1.3.3.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pages":{"types":"./dist/router-pages/index.d.ts","import":"./dist/router-pages/index.js","require":"./dist/router-pages/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"},"./_internal/experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs && node scripts/verify-dist.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.5wp4NbusZa/testa-soft-next-1.3.3.tgz","_integrity":"sha512-yz0LpOEbQIhHulKzhr6NYsl1aTBFoN92mhMC51g2I0umNKl+Y0yvgsU6H1kQ+ZgCD3hjxoz0DJdsiTo3bfc/MA==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"1.3.3","@testa-soft/react":"1.3.3","@testa-soft/experiment-core":"1.3.3"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","react-dom":"18.3.1","typescript":"5.6.3","@types/react":"18.3.12","@types/react-dom":"18.3.1","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_1.3.3_1787668904322_0.7458196671937107","host":"s3://npm-registry-packages-npm-production"}},"1.3.4":{"name":"@testa-soft/next","version":"1.3.4","license":"UNLICENSED","_id":"@testa-soft/next@1.3.4","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"5aef9a8441b2875fc1518c948a7acedd2a7eee95","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-1.3.4.tgz","fileCount":34,"integrity":"sha512-ODVpXcFQgWeOMlv+zWyxMH+/5h2U1mZhMdWzth7FdxaVopOUhwWc1Kb8D6vaeW0H8EzN7yb6IMcx+Whc5Xi6Kw==","signatures":[{"sig":"MEYCIQCEr6owg0CRlnZAtX8hKlNKvy+AAFnjI3dDOeG0P91B1wIhAOhFOGBDkTyFDB+bsJi2uMjxYKnuM7CQvDXqQ7obeeBg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":641808},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.GQNrY9WfKg/testa-soft-next-1.3.4.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pages":{"types":"./dist/router-pages/index.d.ts","import":"./dist/router-pages/index.js","require":"./dist/router-pages/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"},"./_internal/experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs && node scripts/verify-dist.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.GQNrY9WfKg/testa-soft-next-1.3.4.tgz","_integrity":"sha512-ODVpXcFQgWeOMlv+zWyxMH+/5h2U1mZhMdWzth7FdxaVopOUhwWc1Kb8D6vaeW0H8EzN7yb6IMcx+Whc5Xi6Kw==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"1.3.4","@testa-soft/react":"1.3.4","@testa-soft/experiment-core":"1.3.4"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","react-dom":"18.3.1","typescript":"5.6.3","@types/react":"18.3.12","@types/react-dom":"18.3.1","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_1.3.4_1787725199367_0.9215450454111127","host":"s3://npm-registry-packages-npm-production"}},"1.3.5":{"name":"@testa-soft/next","version":"1.3.5","license":"UNLICENSED","_id":"@testa-soft/next@1.3.5","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"8f8e89578924264e32515f13b525013037c77e6c","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-1.3.5.tgz","fileCount":34,"integrity":"sha512-n3u49nqWYxY0NbclI7+oy/8GwTZaovBGpX2QmtVKyr/IXKzjt0gK8uSfVLhpEqWrfezW8Nt37UdEv5GE91KNXg==","signatures":[{"sig":"MEYCIQD3Uz2zREeDZYWx0RUa0I+WZFtea3BPXNXlMdESWkzluwIhAMxrR1OK4OPlU5EQjOKYRcTST8yElLuaoTvMbQpO76AQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":686737},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.l6RxjMYkCx/testa-soft-next-1.3.5.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pages":{"types":"./dist/router-pages/index.d.ts","import":"./dist/router-pages/index.js","require":"./dist/router-pages/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"},"./_internal/experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs && node scripts/verify-dist.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.l6RxjMYkCx/testa-soft-next-1.3.5.tgz","_integrity":"sha512-n3u49nqWYxY0NbclI7+oy/8GwTZaovBGpX2QmtVKyr/IXKzjt0gK8uSfVLhpEqWrfezW8Nt37UdEv5GE91KNXg==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"1.3.5","@testa-soft/react":"1.3.5","@testa-soft/experiment-core":"1.3.5"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","react-dom":"18.3.1","typescript":"5.6.3","@types/react":"18.3.12","@types/react-dom":"18.3.1","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_1.3.5_1787729823865_0.7712532536414312","host":"s3://npm-registry-packages-npm-production"}},"1.3.6":{"name":"@testa-soft/next","version":"1.3.6","license":"UNLICENSED","_id":"@testa-soft/next@1.3.6","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"0ddade82f1a077a99265ff9d9a470e93d60a4812","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-1.3.6.tgz","fileCount":34,"integrity":"sha512-KQo2vY/tPb2qt3ov768T7l+KMf4drOdq3A0WOVeSSMI1bGYPp4CKGOBaRQExFbP+iHZjtDFHId0x4rS7fUDdAQ==","signatures":[{"sig":"MEUCIQDdWrfGba3bMfv+u3SJkQtWiIJ7zpHSS1hMKP1w763HqgIgawINyBoBTDMKvL3i7xO7KggnWOuVArIPsxl843UjoLU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":787531},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.mNsWjrLMoA/testa-soft-next-1.3.6.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pages":{"types":"./dist/router-pages/index.d.ts","import":"./dist/router-pages/index.js","require":"./dist/router-pages/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"},"./_internal/experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs && node scripts/verify-dist.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.mNsWjrLMoA/testa-soft-next-1.3.6.tgz","_integrity":"sha512-KQo2vY/tPb2qt3ov768T7l+KMf4drOdq3A0WOVeSSMI1bGYPp4CKGOBaRQExFbP+iHZjtDFHId0x4rS7fUDdAQ==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"1.3.6","@testa-soft/react":"1.3.6","@testa-soft/experiment-core":"1.3.6"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","react-dom":"18.3.1","typescript":"5.6.3","@types/react":"18.3.12","@types/react-dom":"18.3.1","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_1.3.6_1787900537309_0.07268163738002231","host":"s3://npm-registry-packages-npm-production"}},"1.3.7":{"name":"@testa-soft/next","version":"1.3.7","license":"UNLICENSED","_id":"@testa-soft/next@1.3.7","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"19af049ac669cd4c5c57ca4dc50f529d1447a5b1","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-1.3.7.tgz","fileCount":34,"integrity":"sha512-uepWhcoP9WXx/9csB+S6bqxf4HTITi7aAtCh3I3GT5uUTI6DOFOvUZmeuUCvcaPu4Z6/2py8PsDO2U8E0rwWzw==","signatures":[{"sig":"MEUCIFec+7GE/5O9KqmwKac5SDLr7Hw8PAPbV/6UYdowxCAPAiEAviDk0pcNbAoIwWlMka9xg3SwcZ8uZHzOQJsUZA5bJr0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":787531},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.rjyUSgbd4A/testa-soft-next-1.3.7.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pages":{"types":"./dist/router-pages/index.d.ts","import":"./dist/router-pages/index.js","require":"./dist/router-pages/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"},"./_internal/experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs && node scripts/verify-dist.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.rjyUSgbd4A/testa-soft-next-1.3.7.tgz","_integrity":"sha512-uepWhcoP9WXx/9csB+S6bqxf4HTITi7aAtCh3I3GT5uUTI6DOFOvUZmeuUCvcaPu4Z6/2py8PsDO2U8E0rwWzw==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"1.3.7","@testa-soft/react":"1.3.7","@testa-soft/experiment-core":"1.3.7"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","react-dom":"18.3.1","typescript":"5.6.3","@types/react":"18.3.12","@types/react-dom":"18.3.1","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_1.3.7_1787909970274_0.47640390310091685","host":"s3://npm-registry-packages-npm-production"}},"1.4.0-dev.0":{"name":"@testa-soft/next","version":"1.4.0-dev.0","license":"UNLICENSED","_id":"@testa-soft/next@1.4.0-dev.0","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"a94f0607e6fdc36eedf1e10d4a212f6d9b9094b5","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-1.4.0-dev.0.tgz","fileCount":34,"integrity":"sha512-dAVZPJmfY6q3u8e8A9qfJrUossQ1wYGRAoivRpCJT8nILoO/8zRf6i2jMOXnU+Ovar88erdnkQUT7uM1IXMRHw==","signatures":[{"sig":"MEYCIQDf80OKlja3P63dEUQKUegXBvUjVn97gM44aWXpuRmvyAIhAO09v2XG4yMixryqkzS9sFXJkHfS28bOrK/E/xJek+2w","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":808486},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.Qpt036PFcy/testa-soft-next-1.4.0-dev.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pages":{"types":"./dist/router-pages/index.d.ts","import":"./dist/router-pages/index.js","require":"./dist/router-pages/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"},"./_internal/experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs && node scripts/verify-dist.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.Qpt036PFcy/testa-soft-next-1.4.0-dev.0.tgz","_integrity":"sha512-dAVZPJmfY6q3u8e8A9qfJrUossQ1wYGRAoivRpCJT8nILoO/8zRf6i2jMOXnU+Ovar88erdnkQUT7uM1IXMRHw==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"1.4.0-dev.0","@testa-soft/react":"1.4.0-dev.0","@testa-soft/experiment-core":"1.4.0-dev.0"},"publishConfig":{"tag":"dev","access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","react-dom":"18.3.1","typescript":"5.6.3","@types/react":"18.3.12","@types/react-dom":"18.3.1","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_1.4.0-dev.0_1788208036577_0.2518827192477555","host":"s3://npm-registry-packages-npm-production"}},"1.3.8":{"name":"@testa-soft/next","version":"1.3.8","license":"UNLICENSED","_id":"@testa-soft/next@1.3.8","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"dist":{"shasum":"25081920f6f7fbf6aa665568241415005b3e4178","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-1.3.8.tgz","fileCount":34,"integrity":"sha512-OCl+X0rjrZsjwr6DEk/AYpxvsdrGHlUxee2R703jDhQVuuzyb/Gb9lHl68lk6/B4PAT5x20IgTM4WYhpVI44uw==","signatures":[{"sig":"MEUCIQDrHiWveqcdxRH4J6C/9f7NjEPE8BOJZzB7b7vF4Ih7ZwIgIcV1Q2dUi0SFaPgpg6dFhGRzOzpoKOC3p0S5dqm0UBE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":811050},"main":"./dist/index.cjs","type":"module","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.pt8jjtINiC/testa-soft-next-1.3.8.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pages":{"types":"./dist/router-pages/index.d.ts","import":"./dist/router-pages/index.js","require":"./dist/router-pages/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"},"./_internal/experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsup && node scripts/add-use-client.mjs && node scripts/verify-dist.mjs","clean":"rm -rf dist .turbo coverage *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.pt8jjtINiC/testa-soft-next-1.3.8.tgz","_integrity":"sha512-OCl+X0rjrZsjwr6DEk/AYpxvsdrGHlUxee2R703jDhQVuuzyb/Gb9lHl68lk6/B4PAT5x20IgTM4WYhpVI44uw==","_npmVersion":"11.6.0","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"@testa-soft/dom":"1.3.8","@testa-soft/react":"1.3.8","@testa-soft/experiment-core":"1.3.8"},"publishConfig":{"tag":"latest","access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"15.0.3","tsup":"8.3.5","react":"18.3.1","vitest":"2.1.5","happy-dom":"15.11.4","react-dom":"18.3.1","typescript":"5.6.3","@types/react":"18.3.12","@types/react-dom":"18.3.1","@vitest/coverage-v8":"2.1.5","@testa-platform/shared-types":"0.0.0"},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/next_1.3.8_1788524556699_0.13127269635104444","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@testa-soft/next","version":"1.5.0","type":"module","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","license":"UNLICENSED","sideEffects":false,"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./router-guard":{"types":"./dist/router-guard/index.d.ts","import":"./dist/router-guard/index.js","require":"./dist/router-guard/index.cjs"},"./_internal/experiments":{"types":"./dist/experiments/index.d.ts","import":"./dist/experiments/index.js","require":"./dist/experiments/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.cjs"},"./pages":{"types":"./dist/router-pages/index.d.ts","import":"./dist/router-pages/index.js","require":"./dist/router-pages/index.cjs"}},"peerDependencies":{"next":">=13.4.0","react":">=18"},"peerDependenciesMeta":{"react":{"optional":true}},"publishConfig":{"access":"public","tag":"latest"},"dependencies":{"@testa-soft/dom":"1.5.0","@testa-soft/experiment-core":"1.5.0","@testa-soft/react":"1.5.0"},"devDependencies":{"@types/react":"18.3.12","@types/react-dom":"18.3.1","@vitest/coverage-v8":"2.1.5","happy-dom":"15.11.4","next":"15.0.3","react":"18.3.1","react-dom":"18.3.1","tsup":"8.3.5","typescript":"5.6.3","vitest":"2.1.5","@testa-platform/shared-types":"0.0.0"},"scripts":{"build":"rm -rf dist && tsup && node scripts/add-use-client.mjs && node scripts/verify-dist.mjs","typecheck":"tsc --noEmit","test":"vitest run","test:watch":"vitest","clean":"rm -rf dist .turbo coverage *.tsbuildinfo"},"_id":"@testa-soft/next@1.5.0","_integrity":"sha512-vUHvPJjJlnbOFEOO2QqICNdtFUToM7ppuyhN3Ya9MVYxkj4BkvOAR4a1MZdBi9Oz1dEDEDqYffRsxVw49/E42Q==","_resolved":"/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.OIyCSKdWdZ/testa-soft-next-1.5.0.tgz","_from":"file:/var/folders/b7/0x0c69z537gg9jjwn5x4f7vm0000gn/T/tmp.OIyCSKdWdZ/testa-soft-next-1.5.0.tgz","_nodeVersion":"24.10.0","_npmVersion":"11.6.0","dist":{"integrity":"sha512-vUHvPJjJlnbOFEOO2QqICNdtFUToM7ppuyhN3Ya9MVYxkj4BkvOAR4a1MZdBi9Oz1dEDEDqYffRsxVw49/E42Q==","shasum":"f81843ed1fe8fca9488621066d893ea3f14b589f","tarball":"https://registry.npmjs.org/@testa-soft/next/-/next-1.5.0.tgz","fileCount":34,"unpackedSize":857155,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCgAVoVEd1f599IRXqS7rDkNLtZpbfxiTS8crYFbiOfWgIgaqvtIuq7a7DCsuxuEGCBwRrNrTHeE1c251NbASIZFiA="}]},"_npmUser":{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"},"directories":{},"maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/next_1.5.0_1789045148004_0.20202145342949862"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-17T19:52:44.386Z","modified":"2026-09-10T12:59:08.324Z","0.0.1-dev.0":"2026-08-17T19:52:45.051Z","0.0.2-dev.0":"2026-08-18T04:58:39.697Z","0.0.2-dev.2":"2026-08-18T10:21:10.507Z","0.0.2-dev.3":"2026-08-18T11:05:29.291Z","0.0.2-dev.4":"2026-08-19T14:16:24.492Z","0.0.2-dev.6":"2026-08-19T15:10:38.661Z","0.0.2-dev.7":"2026-08-19T16:15:23.820Z","0.0.2-dev.8":"2026-08-19T21:50:29.900Z","0.0.2-dev.9":"2026-08-19T22:29:18.376Z","0.0.2-dev.10":"2026-08-20T08:11:38.336Z","0.0.2-dev.11":"2026-08-20T09:36:35.536Z","0.0.2-dev.12":"2026-08-20T10:57:24.746Z","0.0.2-dev.13":"2026-08-20T11:39:04.935Z","1.1.0":"2026-08-20T14:05:42.117Z","1.2.0":"2026-08-21T07:00:34.805Z","1.2.1":"2026-08-24T08:58:50.228Z","1.3.0":"2026-08-25T06:45:32.090Z","1.3.1":"2026-08-25T11:57:17.735Z","1.3.2":"2026-08-25T12:25:53.757Z","1.3.3":"2026-08-25T14:41:44.461Z","1.3.4":"2026-08-26T06:19:59.530Z","1.3.5":"2026-08-26T07:37:03.989Z","1.3.6":"2026-08-28T07:02:17.525Z","1.3.7":"2026-08-28T09:39:30.427Z","1.4.0-dev.0":"2026-08-31T20:27:16.737Z","1.4.0":"2026-09-04T11:53:53.406Z","1.3.8":"2026-09-04T12:22:36.836Z","1.5.0":"2026-09-10T12:59:08.148Z"},"license":"UNLICENSED","description":"Testa split-URL A/B testing for Next.js — server-side, flicker-free redirects via middleware.","maintainers":[{"name":"mbagdonas","email":"mantas.bagdonas@testa-soft.com"}],"readme":"# @testa-soft/next\n\nNext.js integration for [Testa](https://testa-soft.tech) A/B testing. It gives you two complementary experiment types from one package: **server-side, flicker-free split-URL redirects** driven by a single middleware, and **client-side HTML/DOM experiments** applied by React components with a built-in anti-flicker shield. Both read the same sticky `_testa_exp` cookie, so a visitor is bucketed once — server-side — and stays in the same variation across page loads, soft navigations, and experiment types.\n\n## Install\n\n```bash\nnpm install @testa-soft/next\n```\n\nPeer dependencies (you almost certainly already have these):\n\n- `next` — `>=13.4.0`\n- `react` — `>=18` (optional; only required if you render the React components from `@testa-soft/next/server` or `@testa-soft/next/router-guard` — the middleware entry `@testa-soft/next` is react-free)\n\n### Which entry do I import from?\n\n| You want | Import from |\n| --- | --- |\n| The middleware / proxy (`createTestaProxy`), event bus, `pushEvent` | `@testa-soft/next` |\n| `<TestaGuard/>` + `<TestaProvider projectId=.../>` for the root layout | `@testa-soft/next/server` — **the only components you should mount** |\n| `<TestaRouterGuard/>` (optional soft-nav safety net) | `@testa-soft/next/router-guard` |\n\nThere is exactly **one** `<TestaProvider>` to use in a Next.js app: the one from\n`@testa-soft/next/server`. (Not using Next.js? Plain React SPAs use\n`@testa-soft/react` instead.) You may see a `./_internal/experiments` path in\nthe exports map — that is the private client half of the `/server` components,\nrequired by the build for the `\"use client\"` boundary. Never import it; it has\nno semver guarantees.\n\n## Quick start — split-URL redirects\n\nSplit-URL tests send a bucketed visitor to a different URL. It's decided server-side and issued as a `307` **before any HTML is sent**, so there is no flicker and no client JS required.\n\nCreate `proxy.ts` at your project root (or under `src/`):\n\n```ts\n// proxy.ts\nimport { createTestaProxy } from '@testa-soft/next'\n\nexport const proxy = createTestaProxy({ projectId: '3fa85f64e1c2b' })\n```\n\n> **Next.js version.** Next 16 renamed the middleware file convention to\n> `proxy` — use `proxy.ts` with `export const proxy = …` (above). On **Next\n> 13–15**, name the file `middleware.ts` and the export `middleware` instead;\n> everything else is identical. `createTestaProxy` is unchanged either way.\n\nThat is the whole integration. `projectId` is your **crobot project UUID**. With\njust `projectId`, the package fetches your project config from the built-in\nconfig host (`https://config.testa-soft.tech/api/v1/config/{projectId}`).\n\nThe proxy is safe on **every** request out of the box: it internally passes\nthrough `/_next/*`, `/api/*`, `/.well-known/*`, static-asset files (images,\nfonts, scripts, `robots.txt`, …), **all non-GET/HEAD requests** (Server\nActions and form submits POST to the page URL — redirecting them would break\nthe action), and **crawlers/scripts/monitors** (Googlebot, curl,\nHeadlessChrome, UptimeRobot, … — see `skipBots`) without touching cookies,\nfetching config, or emitting exposures — no `matcher` needed for correctness.\nPrefetches (App Router `<Link>`, Chrome Speculation Rules) and HEAD requests\nget the real redirect but never commit: no cookie is written and no exposure\nfires for a page the visitor may never actually see.\n\n### Optional: skip invocations with a `matcher`\n\nA `matcher` saves the middleware **invocation itself** on asset requests (edge\ninvocations cost money and add latency on some hosts). It's purely a cost\noptimization — if the regex is wrong or missing, nothing misbehaves:\n\n```ts\n// proxy.ts — optional, saves edge invocations on assets\nexport const config = {\n  matcher: ['/((?!_next/|api/|favicon.ico|sitemap.xml|robots.txt).*)'],\n}\n```\n\n> Next.js requires `matcher` to be a static literal in **your** file (it's\n> parsed at build time), so the package can't provide it for you. Keep it\n> conservative: a path the matcher skips is a path Testa can never test on.\n> To exclude extra routes from experiments, prefer the `skipPaths` option —\n> it lives in one place and takes regexes.\n\n### Inline-config mode\n\nIf you'd rather ship the config yourself (local dev, a demo, or a deploy that\nresolves config from its own source), pass a `config` object instead of relying\non the config host:\n\n```ts\n// proxy.ts  (Next 13–15: middleware.ts, export `middleware`)\nimport { createTestaProxy } from '@testa-soft/next'\nimport projectConfig from './testa.config.json'\n\nexport const proxy = createTestaProxy({\n  projectId: '3fa85f64e1c2b',\n  config: projectConfig, // a ProjectConfig — zero-latency, no network fetch\n})\n```\n\nYou can also point at a custom config host with `host: 'https://config.staging.example.com'`,\nsupply a `configUrl` to fetch from, or provide an async `loadConfig(projectId)`\nresolver (e.g. read Vercel Edge Config). Config caching (`cache` option), shared per server instance:\n\n- `true` (default) — fresh for 60s, then served stale while revalidating in the\n  background (never older than 5 min): zero request latency, publishes live in\n  ~1 min. `cacheTtlMs` tunes the fresh window.\n- `'per-pageload'` — DOCUMENT requests always fetch fresh (a publish is live on\n  the very next hard pageview); RSC soft navigations reuse the pinned copy, so\n  the config never shifts mid-SPA-session.\nThere's deliberately no \"off\" mode — it would add a blocking config fetch to\nevery matched request (soft navs and prefetches included) with no last-known\nfallback; use `'per-pageload'` when testing config changes. If no config can be\nresolved, the middleware fails open and passes the request through untouched.\n\n## Composing with your own middleware\n\nNext.js runs **one** middleware and allows **one** response — and request-header\noverrides (`NextResponse.next({ request: { headers } })`) travel on that\nresponse as a wholesale set. Two separately-built responses can never be merged\nby hand, so if you already have middleware logic (auth, locale, custom headers),\ncompose it with the proxy in one of two ways.\n\n### Your logic inside the proxy — the `handler` option (recommended)\n\n```ts\nexport const proxy = createTestaProxy({\n  projectId: '3fa85f64e1c2b',\n  handler: (req, event) => {\n    // Your middleware logic. `req.headers` already carries x-testa-shield —\n    // clone them when overriding request headers, as you normally would:\n    const headers = new Headers(req.headers)\n    headers.set('x-domain', 'acme.com')\n    return NextResponse.next({ request: { headers } })\n  },\n})\n```\n\nSemantics:\n\n- Requests testa bypasses (`/api/*`, assets, `skipPaths`) go **straight to your\n  handler**, so your headers still reach API routes.\n- A split-URL redirect short-circuits — your handler is not called (nothing\n  downstream renders). A redirect **you** return wins on pass-through requests\n  and gets testa's cookies.\n- On pass-through, testa merges its cookies onto your response and re-patches\n  the `x-testa-shield` override even if you return a plain `NextResponse.next()`\n  or `undefined`.\n\n### Your logic first, then testa (tail call)\n\nTo run your logic **before** testa — short-circuit on auth/maintenance without\ntesta assigning or tracking anything, or compute request headers testa should\ncarry — mutate the request and tail-call the proxy. Testa is transparent to\nupstream request mutation: headers on the request you hand it are forwarded\ndownstream on **every** path (pass-through, bypassed `/api/*`/assets, redirects,\nfail-open):\n\n```ts\nconst testa = createTestaProxy({ projectId: '3fa85f64e1c2b' })\n\nexport async function proxy(req: NextRequest, event: NextFetchEvent) {\n  // Short-circuit BEFORE testa: no exposure fired, no cookies written.\n  if (!isAllowed(req)) return NextResponse.redirect(new URL('/login', req.url))\n\n  const headers = new Headers(req.headers)\n  headers.set('x-domain', 'acme.com')\n  headers.set('x-search', req.nextUrl.search)\n  return testa(new NextRequest(req, { headers }), event) // forward `event`!\n}\n```\n\n### Testa first, then post-process (outer wrapper)\n\nTo act on testa's response — add response headers, or request-header overrides\ncomputed after the fact — call the proxy and post-process. Response headers and\ncookies merge fine with standard APIs; for **request**-header overrides use the\nexported `applyRequestHeaders` (it appends to the proxy's override set instead\nof clobbering it):\n\n```ts\nimport { applyRequestHeaders, createTestaProxy } from '@testa-soft/next'\n\nconst testa = createTestaProxy({ projectId: '3fa85f64e1c2b' })\n\nexport async function proxy(req: NextRequest, event: NextFetchEvent) {\n  if (isMaintenanceMode()) return NextResponse.rewrite(new URL('/down', req.url))\n\n  const res = await testa(req, event) // forward `event` — tracking uses waitUntil\n  res.headers.set('x-frame-options', 'DENY') // response headers merge trivially\n  return applyRequestHeaders(res, { 'x-domain': 'acme.com' }, req)\n}\n```\n\n`applyRequestHeaders(res, headers, req)` is a no-op on redirects, appends when\nthe response already carries an override set, and seeds the full set from\n`req.headers` otherwise (pass `req` — override semantics are wholesale, and\nseeding only your headers would drop every other request header downstream).\n\n## HTML/DOM experiments\n\nFor \"same URL, different content\" tests, Testa applies **crobot-native DOM\nchanges** on the client. The split is:\n\n- **Middleware assigns** the visitor server-side and writes the sticky\n  `_testa_exp` cookie (add the middleware from the quick start above — DOM\n  experiments reuse the exact same assignment).\n- **`<TestaProvider/>` renders** that assignment on the client, cookie-first:\n  it reads `_testa_exp`, looks up the variation's changes in the config, and\n  applies them to the DOM. No re-bucketing happens on the client.\n\nBecause DOM changes mutate content the server already rendered (the control),\nthere's an unavoidable control→variant flash unless the page is hidden until the\nvariant is applied. `<TestaGuard/>` handles that: it's a synchronous inline\n`<head>` script that hides the content **before first paint** (with a hard\ntimeout fallback so a slow or broken apply can never leave the page blank), and\n`<TestaProvider/>` reveals it once the variant is on the page.\n\nAdd both in your root layout — the shield as high in `<head>` as possible, and\nthe experiments component anywhere in the body. Use the **server entry**: the\nconfig is fetched server-side on the first request and cached in the Next data\ncache (background-revalidated) — no app-side fetch code:\n\n```tsx\n// app/layout.tsx\nimport { TestaGuard, TestaProvider } from '@testa-soft/next/server'\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n  return (\n    <html lang=\"en\">\n      <head>\n        {/* Self-gating: renders the shield ONLY when the middleware flagged a\n            pending DOM change for this request (x-testa-shield header). */}\n        <TestaGuard selector=\"body\" timeoutMs={4000} />\n      </head>\n      <body>\n        {children}\n        {/* Fetches the config server-side (same id as the proxy), then applies\n            the assigned variation's DOM changes client-side. Re-applies on\n            App-Router soft navigation. Fails open if config is unreachable. */}\n        <TestaProvider projectId=\"3fa85f64e1c2b\" />\n      </body>\n    </html>\n  )\n}\n```\n\nManaging the config yourself (local fixture, demo, self-managed JSON)? Pass it\ninline — the same `/server` components accept a `config` prop, which skips\ntheir fetch entirely: `<TestaProvider config={projectConfig} />`.\n\nSupported change types are crobot-native and applied by the shared DOM engine:\n\n| Change type            | Effect                                                              |\n| ---------------------- | ------------------------------------------------------------------ |\n| `change_html`          | Set matched elements' `innerHTML` to `content`.                    |\n| `css`                  | Inject a `<style>` with `content` (optionally `global`).           |\n| `hide_element`         | `display:none` on matched elements.                               |\n| `append_html`          | `insertAdjacentHTML('beforeend', content)` on matched elements.    |\n| `prepend_html`         | `insertAdjacentHTML('afterbegin', content)` on matched elements.   |\n| `move_element_append`  | Move matched elements under the target selector (append).          |\n| `move_element_prepend` | Move matched elements under the target selector (prepend).         |\n\n> Split-URL-only deployments don't need `<TestaGuard/>` — the middleware's\n> `307` is already flicker-free. The shield only matters when you apply DOM\n> changes on top of server-rendered content.\n\n## Preview mode\n\nEditors can preview **unpublished** variation drafts live, without them going to\nreal visitors. Pass `previewApiUrl` (your crobot backend base URL) to\n`<TestaProvider/>`:\n\n```tsx\n<TestaProvider config={projectConfig} previewApiUrl=\"https://new.testa-soft.tech\" />\n```\n\nThen open any page with the preview query params:\n\n```\nhttps://yoursite.com/pricing?testa_preview=true&testa_preview_token=<token>\n```\n\nIn preview mode `<TestaProvider/>` **skips normal cookie assignment** and\ninstead fetches the draft changes for that session from\n`{previewApiUrl}/api/preview/{token}` and applies them. The fetched changes are\nthe same crobot-native `VariationChange` shapes as real variations, so a draft\nrenders identically to how it will ship. A failed or malformed response applies\nnothing and reveals the shield (fail-safe).\n\n## Pages Router\n\nThe whole client half is one component — `<TestaProvider/>` from\n`@testa-soft/next/pages`, once in `_app.tsx`:\n\n```tsx\n// pages/_app.tsx\nimport { TestaProvider } from '@testa-soft/next/pages'\n\nexport default function App({ Component, pageProps }) {\n  return (\n    <TestaProvider projectId=\"3fa85f64e1c2b\">\n      <Component {...pageProps} />\n    </TestaProvider>\n  )\n}\n```\n\nIt self-wires the client engine, the soft-nav router guard below, and\n**anti-flicker on by default** — a JS-free `<style>` server-rendered into\n`<head>` through `next/head`, unrendered the moment the variant is applied. That\nhas to come from the server here: the Pages Router paints its server-rendered\ncontrol HTML before React hydrates, so a shield raised from an effect arrives\ntoo late and produces *two* flashes (content → blank → variant) instead of\nnone. `shield={false}` opts out; an object passes `selector` / `timeoutMs` /\n`mode` through. The reveal has a CSS-only fallback at `timeoutMs`, so a broken\nbundle can't leave a site hidden.\n\nOptionally add `<TestaGuard/>` to `pages/_document.tsx`. It doesn't change the\nshield — it starts the config fetch during HTML parse rather than after\nhydration, shortening the window the page spends hidden.\n\n### Soft navigation\n\nClient-side navigations in the **Pages Router** (static `next/link` navs) never\nhit the server, so the middleware can't see them. `<TestaRouterGuard/>` closes\nthat gap; the `/pages` provider above already wires it up, so reach for it\ndirectly only if you want the pieces individually:\n\n```tsx\n// pages/_app.tsx\nimport { TestaRouterGuard } from '@testa-soft/next/router-guard'\nimport projectConfig from '../testa.config.json'\n\nexport default function App({ Component, pageProps }) {\n  return (\n    <>\n      <TestaRouterGuard config={projectConfig} />\n      <Component {...pageProps} />\n    </>\n  )\n}\n```\n\nIt is cookie-first, just like the middleware: it reads the sticky `_testa_exp`\nassignment (no re-roll, no config re-fetch) and, on a navigation to a control\nURL for a split-URL experiment the visitor is bucketed to a variant of, aborts\nthe in-flight navigation and `router.replace()`s to the variant before the\ncontrol page renders. A visitor gets the same variant whether the middleware or\nthe guard fires — both read the one cookie.\n\n> App Router users don't need this — `<TestaProvider/>` re-applies DOM\n> experiments on soft navigation, and the middleware handles split-URL\n> redirects (including a prefetch-safe path for `<Link>` prefetches).\n\n## Behind a proxy / ingress (k8s, istio, CDN)\n\nOn Vercel the middleware sees the real public URL. On self-hosted stacks the\ningress/mesh layer (k8s ingress, istio sidecars, a CDN in front) often rewrites\n`Host` before the request reaches Next.js, so the middleware sees an internal\nURL like `http://10.0.3.17:3000/pricing`. Split-URL rules target **public**\nURLs, so experiments would silently never match.\n\nThe proxy recovers the public URL through this chain (first valid value wins;\nhost and scheme resolve independently, and malformed values fall through):\n\n1. **`publicHost` option / `TESTA_PUBLIC_HOST` env** — explicit, always wins.\n2. **`x-testa-host`** (+ optional **`x-testa-proto`**) request headers — set\n   them at the ingress when it mangles `Host` and you can't change app code.\n3. **`Forwarded`** (RFC 7239, `host=`/`proto=` of the first element).\n4. **`X-Forwarded-Host`** / **`X-Forwarded-Proto`** (first value of each list).\n5. The `Host` header, then the request URL as-is.\n\n**Ports** come from the winning host only. `X-Forwarded-Port` is ignored —\nmeshes set it to the port they forward *to* (istio sends the app's `:3000`), and\n`https://www.acme.com:3000/pricing` matches nothing a dashboard can author. State\na real non-default public port via `publicHost: 'acme.com:8443'`. Matching is\nforgiving the same way: a rule authored without a port matches any port; one that\nnames a port stays strict (`localhost:3200` never matches `localhost:5002`).\n\nMost reverse proxies (nginx ingress, traefik, Cloudflare) already send\n`X-Forwarded-Host`/`-Proto`, so usually **it just works with no config**. If\nyours doesn't (or istio overwrites them), pin it explicitly:\n\n```ts\nexport const middleware = createTestaProxy({\n  projectId: '3fa85f64e1c2b',\n  publicHost: 'https://www.acme.com', // or bare host: 'www.acme.com'\n});\n```\n\nor per-request (multi-tenant):\n\n```ts\npublicHost: (req) => req.headers.get('x-tenant-host'),\n```\n\nor with zero code changes, via env (`TESTA_PUBLIC_HOST=https://www.acme.com`)\nor by injecting the header at the ingress (istio `VirtualService` example):\n\n```yaml\nhttp:\n  - headers:\n      request:\n        set:\n          x-testa-host: www.acme.com\n          x-testa-proto: https\n```\n\nThe resolved public URL drives experiment URL matching, `discoverRootDomain`\ncookie discovery, redirect `Location`s, and exposure-tracking URLs.\n\n> Security note: forwarded headers are request headers. An ingress that doesn't\n> own `x-testa-host` / `X-Forwarded-Host` should strip client-sent values, as\n> proxies conventionally do for forwarded headers.\n\n## Debugging (`debug: true`)\n\nWhen an experiment doesn't fire and you can't tell why, turn on tracing:\n\n```ts\nexport const middleware = createTestaProxy({\n  projectId: '3fa85f64e1c2b',\n  debug: true, // or set TESTA_DEBUG=1 — no code change\n});\n```\n\nEvery request then emits ONE compact JSON decision trace, in two places:\n\n- a **`[testa] {…}` console line** — Vercel function logs, `next start`\n  stdout, your pod's logs;\n- an **`x-testa-debug` response header** — open the browser network tab (or\n  `curl -sI https://acme.com/pricing`) and read the decision right off the\n  response, no log access needed.\n\nWhat it answers:\n\n```jsonc\n// why did nothing happen? → the proxy never saw it as a page\n{\"url\":\"https://acme.com/pricing\",\"bypass\":\"method\",\"method\":\"POST\"}\n{\"url\":\"https://acme.com/logo.png\",\"bypass\":\"path\"}\n{\"url\":\"https://acme.com/pricing\",\"bypass\":\"bot\"}   // crawler/script UA — curl included!\n{\"url\":\"https://acme.com/pricing\",\"urlSource\":\"host\",\"bypass\":\"no-config\"}\n\n// what URL did targeting actually run against, and which mechanism produced it?\n{\"url\":\"https://acme.com/pricing\",\"urlSource\":\"x-forwarded-host\",\n \"visitor\":\"9f2…\",\"configHash\":\"hash-1\",\n \"applied\":[{\"experiment\":101,\"variation\":2,\"first\":true}],\n \"redirect\":\"https://acme.com/pricing-v2\"}\n\n// pass-through: assignment + whether the anti-flicker shield was raised\n{\"url\":\"https://acme.com/pricing\",\"urlSource\":\"request-url\",\n \"applied\":[{\"experiment\":101,\"variation\":1,\"first\":false}],\"shield\":false}\n```\n\n`urlSource` is the winning mechanism from\n[public-URL resolution](#behind-a-proxy--ingress-k8s-istio-cdn): `option`,\n`x-testa-host`, `forwarded`, `x-forwarded-host`, `host`, or `request-url`.\n\n> Don't leave `debug` on in production: the header exposes experiment\n> internals (experiment/variation ids, visitor id) to anyone who can see the\n> response.\n\n## API reference\n\n### `createTestaProxy(options)`\n\nReturns a Next.js middleware function. Import from `@testa-soft/next`.\n\n| Option               | Type                                          | Default                              | Description                                                                                                    |\n| -------------------- | --------------------------------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------ |\n| `projectId`          | `string`                                      | —                                    | **Required.** Your project id. Config is fetched from `{host}/api/v1/config/{projectId}`.                     |\n| `projectSlug`        | `string`                                      | —                                    | _Deprecated_ alias for `projectId`.                                                                          |\n| `config`             | `ProjectConfig`                               | —                                    | Static config object. Zero-latency, no network fetch. Wins over `configUrl` / `loadConfig`.                   |\n| `configUrl`          | `string`                                      | —                                    | URL to fetch a `ProjectConfig` JSON from. Cached by TTL.                                                      |\n| `loadConfig`         | `(projectId) => Promise<ProjectConfig \\| null>` | —                                  | Custom async config resolver (e.g. Edge Config). Cached by TTL.                                               |\n| `cacheTtlMs`         | `number`                                       | `30000`                              | Cache lifetime for `configUrl` / `loadConfig` results.                                                       |\n| `host`               | `string`                                       | `https://config.testa-soft.tech`     | Config host. Also settable via the `TESTA_CONFIG_HOST` env var. Override for local/staging.                   |\n| `secureCookies`      | `boolean`                                      | `true`                               | Emit `Secure` cookies. Set `false` for local http dev.                                                       |\n| `cookieDomain`       | `string`                                       | —                                    | Explicit cookie `Domain` for cross-subdomain tracking (e.g. `.example.com`). Wins over `discoverRootDomain`.     |\n| `discoverRootDomain` | `boolean`                                      | `false`                              | Auto-derive the registrable domain from the request host for cookies.                                        |\n| `publicHost`         | `string \\| (req) => string \\| null`           | —                                    | The site's **public** host (`'www.acme.com'` or `'https://www.acme.com'`) when your ingress rewrites `Host` — see [Behind a proxy / ingress](#behind-a-proxy--ingress-k8s-istio-cdn). Also settable via the `TESTA_PUBLIC_HOST` env var. |\n| `debug`              | `boolean`                                      | `false`                              | Per-request decision trace: a `[testa] {…}` console line + an `x-testa-debug` response header — see [Debugging](#debugging-debug-true). Also settable via the `TESTA_DEBUG=1` env var. |\n| `skipBots`           | `boolean`                                      | `true`                               | Skip experiments for crawlers/scripts/monitors (UA-based): clean pass-through, no cookies, no redirect, no exposures. Note `curl` counts as a bot — send a browser UA (`curl -A 'Mozilla/5.0 …'`) to see experiment behavior. |\n| `tracking`           | `boolean`                                      | `true`                               | Emit exposures (impressions) so experiment results populate. Set `false` for redirects-only, or if a pixel owns tracking. |\n| `trackingHost`       | `string`                                       | `https://new.testa-soft.tech`        | Host for exposure tracking (`{trackingHost}/api/leads`). Also settable via the `TESTA_TRACKING_HOST` env var. |\n| `skipPaths`          | `(string \\| RegExp)[]`                         | —                                    | Extra paths to pass through untouched, on top of the built-in filter (`/_next/*`, `/api/*`, `/.well-known/*`, asset extensions). Strings match as segment-aligned prefixes (`'/admin'` matches `/admin/users`, not `/administrator`); RegExps test the pathname. |\n| `handler`            | `(req, event) => Response \\| null \\| undefined \\| Promise<…>` | —                     | Your own middleware logic, composed inside the proxy — see [Composing with your own middleware](#composing-with-your-own-middleware). |\n| `visitorId`          | `string \\| ((req) => string \\| null)`         | —                                    | Use YOUR visitor id instead of Testa's `_testa_uuid`, so an assignment reported from the edge lands on the person your analytics already knows. A **seed** — a visitor who already has an id keeps it, so nobody is re-bucketed. For an id you must `await`, use `setVisitorId(req, id)` instead. Must be stable per visitor. |\n| `onVariationAssigned`| `(event, ctx) => void \\| Promise<void>`       | —                                    | **Server-side** hook per assignment, fired BEFORE any split-URL `307`. `ctx.waitUntil(promise)` keeps async work (a warehouse write, a webhook) alive past the response — never delays it. `ctx.request` is the `NextRequest`, so you can key the event to your own analytics' visitor id. Guard on `event.firstAssignment` for once-per-visitor. |\n| `tracking`           | `boolean`                                     | `true`                               | Report the exposure to Testa at assignment. This is the only point that counts BOTH arms at the same depth in the funnel — counting from the browser puts the variant a `307` and a page load behind the control and undercounts it (SRM). Set `false` to leave counting to `<TestaProvider/>`. |\n| `trackingHost`       | `string`                                      | `TESTA_TRACKING_HOST` \\| SDK default  | Base URL for `/api/leads` and the `/log` beacon. |\n\nExported constants: `DEFAULT_CONFIG_HOST`, `DEFAULT_TRACKING_HOST`, `PUBLIC_HOST_HEADER`, `PUBLIC_PROTO_HEADER`. Exported\ntype: `VariationAppliedEvent` (the argument to `onVariationAssigned`).\n\n## Analytics events\n\nTwo independent surfaces — use either or both:\n\n**Client-side** — the SDK fires **`variation_applied`** in the browser once per\nsession when a visitor is shown a variation (after the redirect for split-URL, on\nthe page for DOM). Subscribe with named functions — multiple handlers allowed,\neach returning its own unsubscribe:\n\n```tsx\n// app/components/TestaAnalytics.tsx\n'use client'\n\nimport { onVariationApplied } from '@testa-soft/next'\nimport { useEffect } from 'react'\n\nexport function TestaAnalytics(): null {\n  // onVariationApplied returns its own unsubscribe, so returning it from the\n  // effect is the whole cleanup — without it, Fast Refresh and StrictMode's\n  // double mount stack duplicate handlers.\n  // `track` is whatever you already use — an analytics SDK, or your own fetch.\n  useEffect(() => onVariationApplied((d) => track('Experiment Viewed', d)), [])\n  return null\n}\n// d = { project_id, experiment, variation, uuid, title, url }\n```\n\nRender it once under your root layout. Module-scope `testa.onVariationApplied(...)`\nalso works, but only outside a React tree — a server component has no `window`,\nand nothing ever unsubscribes.\n\nA handler registered **after** the event fired still receives it (history\nreplay), so late-loading analytics don't miss it. `window.testa.onVariationApplied`\nis also installed for GTM Custom HTML / non-bundled scripts.\n\n**GTM `dataLayer`** — pushed automatically (no config) on every `variation_applied`:\n\n```js\n{ event: 'Analytica', ExperimentId, ExperimentName, VariationId, VariationName }\n```\nAdd a GTM **Custom Event** trigger on `Analytica`.\n\n**Server-side** — for a warehouse, a server-side collector, or webhooks, use the\n`onVariationAssigned` proxy option (above) with `ctx.waitUntil`. It's independent\nof the client surface — wire up both if you want.\n\n> `variation_assigned` = when the visitor is bucketed (server); `variation_applied`\n> = when they're shown it (client, once per session). Both carry the same payload.\n\n### `<TestaProvider>` — from `@testa-soft/next/server` (recommended)\n\nAsync server component: fetches the config server-side (Next data cache) and\nrenders the client applier. Fails open (renders nothing) on any config failure.\n\n| Prop            | Type            | Default                          | Description                                                           |\n| --------------- | --------------- | -------------------------------- | --------------------------------------------------------------------- |\n| `projectId`     | `string`        | —                                | **Required** (unless `config` given). Same id as `createTestaProxy`.  |\n| `config`        | `ProjectConfig` | —                                | Inline config — skips the fetch.                                       |\n| `host`          | `string`        | `https://config.testa-soft.tech` | Config host. Also via `TESTA_CONFIG_HOST`.                             |\n| `revalidateSec` | `number`        | `30`                             | Next data-cache revalidation window.                                   |\n| `previewApiUrl` | `string`        | —                                | Backend base URL; enables `?testa_preview`.                            |\n| `trackingHost`  | `string`        | `https://new.testa-soft.tech`    | Backend base URL for goal conversions.                                 |\n\n### `<TestaGuard>` — from `@testa-soft/next/server`\n\nAsync server component rendering the anti-flicker shield. **Self-gating**:\nrenders only when the middleware set `x-testa-shield: 1` for this request.\nOutside a request scope (static generation) it renders nothing.\n\n| Prop        | Type                        | Default     | Description                                                                                   |\n| ----------- | --------------------------- | ----------- | -------------------------------------------------------------------------------------------- |\n| `selector`  | `string`                    | `'body'`    | CSS selector to hide until reveal.                                                            |\n| `timeoutMs` | `number`                    | `4000`      | Hard fallback (ms) after which the shield auto-reveals no matter what.                        |\n| `mode`      | `'opacity' \\| 'visibility'` | `'opacity'` | How to hide. `opacity` keeps layout (no reflow on reveal).                                    |\n| `styleId`   | `string`                    | —           | `<style>` element id — makes raising idempotent and reveal targeted.                          |\n\n`loadTestaConfig({ projectId, host?, revalidateSec? })` is also exported from\n`/server` for custom server code — resolves `null` on any failure (fail open).\n\n### `<TestaRouterGuard>` — from `@testa-soft/next/router-guard`\n\n| Prop     | Type            | Default | Description                                                                          |\n| -------- | --------------- | ------- | ----------------------------------------------------------------------------------- |\n| `config` | `ProjectConfig` | —       | **Required.** The same config the middleware uses.                                  |\n\n## How it works\n\n- **Server-side assignment, cookie-first.** The middleware buckets each visitor\n  deterministically and writes the sticky `_testa_exp` cookie (plus a `_testa`\n  visitor id). Every surface — middleware, `<TestaProvider/>`,\n  `<TestaRouterGuard/>` — reads that one cookie, so a visitor sees the same\n  variation everywhere with no re-rolling.\n- **Split-URL is a `307` before HTML.** For split-URL experiments the middleware\n  redirects at the edge before any markup is sent, so there is no flash and no\n  client JS needed. `<Link>` prefetches (RSC requests) are handled specially: the\n  prefetch is redirected to warm the variant into the router cache, but no cookie\n  is written and no exposure is emitted until a real navigation commits.\n- **DOM changes apply on the client, behind a shield.** For same-URL experiments\n  `<TestaProvider/>` applies the assigned variation's DOM changes after\n  hydration and re-applies on App-Router soft navigation. `<TestaGuard/>` hides\n  the page before first paint so control content is never shown before the\n  variant, and reveals it once the variant is applied (or after the timeout).\n- **Exposures feed results.** When tracking is enabled, the middleware emits one\n  exposure per fresh enrollment to the tracking host so experiment results\n  populate; it's deduped server-side.\n```\n","readmeFilename":"README.md"}