{"_id":"@remix-run/test","_rev":"12-e06a47bbe055fcf3b081143a29f9ccd5","name":"@remix-run/test","dist-tags":{"latest":"1.0.0"},"versions":{"0.0.0":{"name":"@remix-run/test","version":"0.0.0","license":"MIT","_id":"@remix-run/test@0.0.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"101c960d3a1844461132312aed2f0c346a1037c5","tarball":"https://registry.npmjs.org/@remix-run/test/-/test-0.0.0.tgz","fileCount":2,"integrity":"sha512-QJOlCrWUa2VeWg32ou4XwWQ0H/gYHCpJqhR3oRscRhW3EPe5rEoT6uQIr/vBqnKqIOlS7BMrJ7dvKcJcJ+1j5w==","signatures":[{"sig":"MEQCIATI1cIoUQXC3/iNxkOBBGS8og8VtjjXgXCNR/HmCcU3AiBn45b5ulGYIa1i7jmE+o7jUxO/DW0zEm0skR745XjBbQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":455},"_npmUser":{"name":"mjackson","email":"mjijackson+npm@gmail.com"},"repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/test"},"_npmVersion":"11.12.1","description":"Placeholder package for Remix CI/OIDC setup","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/test_0.0.0_1776815455768_0.030790085957866475","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@remix-run/test","version":"0.1.0","keywords":["testing","browser","test","remix","component","playwright"],"author":{"name":"Shopify Inc."},"license":"MIT","_id":"@remix-run/test@0.1.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/test#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"bin":{"remix-test":"dist/cli.js"},"dist":{"shasum":"2ad93d6f22fc6a52dec71775aef706d00f15ef78","tarball":"https://registry.npmjs.org/@remix-run/test/-/test-0.1.0.tgz","fileCount":86,"integrity":"sha512-SS7ikDqlc8GsLUmpZuTd87ZNgGCxRIuO6ujzUvupxgqWnMgjCWiXyH6q8ejdeHmlNBRa/ODKT3aynJoJ7gaVjA==","signatures":[{"sig":"MEYCIQCizS8gFKrbVA36z8Dx/1efkcnsP0Z3Y/Oh81rPVEIp2wIhAOw/ZF4SwoxyGd+caLKihrCSg3dj/+cHUGoWMqSBmBKo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ftest@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":166475},"type":"module","_from":"file:remix-run-test-0.1.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cli":"./dist/cli.js","./package.json":"./package.json"},"scripts":{"test":"node src/cli.ts","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b0ae6eee-6430-49d6-ba26-73f9227a56f6"}},"_resolved":"/tmp/a72a5b0bf60e8fe48eaea3e163ec9f4d/remix-run-test-0.1.0.tgz","_integrity":"sha512-SS7ikDqlc8GsLUmpZuTd87ZNgGCxRIuO6ujzUvupxgqWnMgjCWiXyH6q8ejdeHmlNBRa/ODKT3aynJoJ7gaVjA==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/test"},"_npmVersion":"11.12.1","description":"A browser-based test framework for Remix components","directories":{},"_nodeVersion":"24.15.0","dependencies":{"tsx":"^4.21.0","@remix-run/component":"0.7.0","@remix-run/fetch-router":"0.18.1","@remix-run/node-fetch-server":"0.13.0"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.59.0","@types/node":"^24.6.0","@remix-run/assert":"0.1.0","@typescript/native-preview":"7.0.0-dev.20251125.1"},"peerDependencies":{"playwright":"^1.59.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/test_0.1.0_1776904639084_0.23701423249065656","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@remix-run/test","version":"0.2.0","keywords":["testing","browser","test","remix","component","playwright"],"author":{"name":"Shopify Inc."},"license":"MIT","_id":"@remix-run/test@0.2.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/test#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"bin":{"remix-test":"dist/cli-entry.js"},"dist":{"shasum":"e3c2cc7afcedc25f2387af374fa1294372801071","tarball":"https://registry.npmjs.org/@remix-run/test/-/test-0.2.0.tgz","fileCount":150,"integrity":"sha512-H1rXtk1YRTJqKJfYN9C2FXcByG9gm9wyzBfRmiofZxI9pK+S1ba1r/oMCxHoJjuLqTHksIB8hKCxtBVhvmfrfg==","signatures":[{"sig":"MEQCIEbVbf2tJfdyGQ4nXqzQ/bcN+hbM2nkNtQWEoVU12ORzAiAJ1wQR3OMGYdPNLW9ABQXTqrIDATxTiwqdRNBysNjmdQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ftest@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":305780},"type":"module","_from":"file:remix-run-test-0.2.0.tgz","engines":{"node":">=24.3.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js"},"./package.json":"./package.json"},"scripts":{"test":"node src/cli-entry.ts","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun --bun src/cli-entry.ts --type server","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b0ae6eee-6430-49d6-ba26-73f9227a56f6"}},"_resolved":"/tmp/b6b63e27e84e4def64e6bd62e049b594/remix-run-test-0.2.0.tgz","_integrity":"sha512-H1rXtk1YRTJqKJfYN9C2FXcByG9gm9wyzBfRmiofZxI9pK+S1ba1r/oMCxHoJjuLqTHksIB8hKCxtBVhvmfrfg==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/test"},"_npmVersion":"11.11.0","description":"A test framework for JavaScript and TypeScript projects","directories":{},"_nodeVersion":"24.14.1","dependencies":{"tsx":"^4.21.0","esbuild":"^0.27.1","get-tsconfig":"^4.13.6","magic-string":"^0.30.21","source-map-js":"^1.2.1","v8-to-istanbul":"^9.3.0","es-module-lexer":"^2.0.0","istanbul-reports":"^3.2.0","@remix-run/terminal":"^0.1.0","istanbul-lib-report":"^3.0.1","istanbul-lib-coverage":"^3.2.2"},"_hasShrinkwrap":false,"devDependencies":{"decamelize":"^6.0.1","playwright":"^1.59.0","@types/node":"^24.6.0","@remix-run/ui":"^0.1.0","@remix-run/assert":"^0.1.0","@types/dom-navigation":"1.0.6","@types/istanbul-reports":"^3.0.4","@types/istanbul-lib-report":"^3.0.3","@typescript/native-preview":"7.0.0-dev.20251125.1","@remix-run/node-fetch-server":"^0.13.0","@types/istanbul-lib-coverage":"^2.0.6"},"peerDependencies":{"playwright":"^1.59.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/test_0.2.0_1777483761467_0.22202805187428853","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@remix-run/test","version":"0.3.0","keywords":["testing","browser","test","remix","component","playwright"],"author":{"name":"Shopify Inc."},"license":"MIT","_id":"@remix-run/test@0.3.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/test#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"bin":{"remix-test":"dist/cli-entry.js"},"dist":{"shasum":"75a3ece9c3223607c1bf690f6d70baa5cf61ce0e","tarball":"https://registry.npmjs.org/@remix-run/test/-/test-0.3.0.tgz","fileCount":166,"integrity":"sha512-amfWPIenHXXZqozPY+LUqspjmaSjHAW5J6jd4Owl180AEc+14IdMPy3D0x27S9ArjRioiqsPBKpYP1EmRft61g==","signatures":[{"sig":"MEYCIQDLel2o4uY1eIPPcQzsS0MpZRukd7tDFghp+8Lb7yPmRgIhAPS/+mCBwUaTsY2Ty54KqRfXG8hYpiLfP/RMs+H9rDD3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ftest@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":348238},"type":"module","_from":"file:remix-run-test-0.3.0.tgz","engines":{"node":">=24.3.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js"},"./package.json":"./package.json"},"scripts":{"test":"node src/cli-entry.ts","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun --bun src/cli-entry.ts --type server","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b0ae6eee-6430-49d6-ba26-73f9227a56f6"}},"_resolved":"/tmp/3ed6cd2270c20179ea899dfb3ce7fbd4/remix-run-test-0.3.0.tgz","_integrity":"sha512-amfWPIenHXXZqozPY+LUqspjmaSjHAW5J6jd4Owl180AEc+14IdMPy3D0x27S9ArjRioiqsPBKpYP1EmRft61g==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/test"},"_npmVersion":"11.11.0","description":"A test framework for JavaScript and TypeScript projects","directories":{},"_nodeVersion":"24.14.1","dependencies":{"tsx":"^4.21.0","esbuild":"^0.27.1","get-tsconfig":"^4.13.6","magic-string":"^0.30.21","source-map-js":"^1.2.1","v8-to-istanbul":"^9.3.0","es-module-lexer":"^2.0.0","istanbul-reports":"^3.2.0","@remix-run/terminal":"^0.1.0","istanbul-lib-report":"^3.0.1","istanbul-lib-coverage":"^3.2.2"},"_hasShrinkwrap":false,"devDependencies":{"decamelize":"^6.0.1","playwright":"^1.59.0","@types/node":"^24.6.0","@remix-run/ui":"^0.1.1","@remix-run/assert":"^0.2.0","@types/dom-navigation":"1.0.6","@types/istanbul-reports":"^3.0.4","@types/istanbul-lib-report":"^3.0.3","@typescript/native-preview":"7.0.0-dev.20251125.1","@remix-run/node-fetch-server":"^0.13.1","@types/istanbul-lib-coverage":"^2.0.6"},"peerDependencies":{"playwright":"^1.59.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/test_0.3.0_1777576237158_0.4843157675177121","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@remix-run/test","version":"0.4.0","keywords":["testing","browser","test","remix","component","playwright"],"author":{"name":"Shopify Inc."},"license":"MIT","_id":"@remix-run/test@0.4.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/test#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"bin":{"remix-test":"dist/cli-entry.js"},"dist":{"shasum":"3e4dd34cd2ec4b401681e1f29d407ab1a2fb1ef0","tarball":"https://registry.npmjs.org/@remix-run/test/-/test-0.4.0.tgz","fileCount":166,"integrity":"sha512-sNnb29cWzUo3WS8xYzROI8lDA8ib2zIzKwJ5SNUgPiKaNwgO6tudAyN7G8zl/oeH6+2ehYCAW6GZEEJZJAzIyw==","signatures":[{"sig":"MEYCIQCzeDg0Pxb9UBC39xH7wdlOVvzPQpJ8qZOQPKbiqQeFZwIhAOvFOUqGpVmh7fr4A8f3f4pnrBXzWZppsnfj28yBYFyU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ftest@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":359784},"type":"module","_from":"file:remix-run-test-0.4.0.tgz","engines":{"node":">=24.3.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js"},"./package.json":"./package.json"},"scripts":{"test":"node src/cli-entry.ts","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun --bun src/cli-entry.ts --type server","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b0ae6eee-6430-49d6-ba26-73f9227a56f6"}},"_resolved":"/tmp/65d17f13d7f6b5e5f9265d65267bc2dd/remix-run-test-0.4.0.tgz","_integrity":"sha512-sNnb29cWzUo3WS8xYzROI8lDA8ib2zIzKwJ5SNUgPiKaNwgO6tudAyN7G8zl/oeH6+2ehYCAW6GZEEJZJAzIyw==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/test"},"_npmVersion":"11.12.1","description":"A test framework for JavaScript and TypeScript projects","directories":{},"_nodeVersion":"24.15.0","dependencies":{"esbuild":"^0.27.1","get-tsconfig":"^4.13.6","magic-string":"^0.30.21","source-map-js":"^1.2.1","v8-to-istanbul":"^9.3.0","es-module-lexer":"^2.0.0","istanbul-reports":"^3.2.0","@remix-run/node-tsx":"^0.1.0","@remix-run/terminal":"^0.1.0","istanbul-lib-report":"^3.0.1","istanbul-lib-coverage":"^3.2.2"},"_hasShrinkwrap":false,"devDependencies":{"decamelize":"^6.0.1","playwright":"^1.59.0","@types/node":"^24.6.0","@remix-run/ui":"^0.1.2","@remix-run/assert":"^0.2.0","@types/dom-navigation":"1.0.6","@types/istanbul-reports":"^3.0.4","@types/istanbul-lib-report":"^3.0.3","@typescript/native-preview":"7.0.0-dev.20251125.1","@remix-run/node-fetch-server":"^0.13.2","@types/istanbul-lib-coverage":"^2.0.6"},"peerDependencies":{"playwright":"^1.59.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/test_0.4.0_1779247225439_0.7644769849323969","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@remix-run/test","version":"0.4.1","keywords":["testing","browser","test","remix","component","playwright"],"author":{"name":"Shopify Inc."},"license":"MIT","_id":"@remix-run/test@0.4.1","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/test#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"bin":{"remix-test":"dist/cli-entry.js"},"dist":{"shasum":"e201bc3c3ee23bbb1041d73594e9629fe3a9f818","tarball":"https://registry.npmjs.org/@remix-run/test/-/test-0.4.1.tgz","fileCount":166,"integrity":"sha512-5PzhLa1/B+TEgTJ46xJ0ytWUxDZjnkw40VbsXt82qta4GlrRFsoUif8kBfXWNyAyfdHWTBn+4/PqMeev5DYMRA==","signatures":[{"sig":"MEQCIG0rvi6gCHYebeHD9PRSB69Cu+SwNde7LtLkb0kpOAf8AiBBZ3BxFATsyrI1oo1pccq/kt/JJZeJ135mAowptLPMSg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ftest@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":359785},"type":"module","_from":"file:remix-run-test-0.4.1.tgz","engines":{"node":">=24.3.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js"},"./package.json":"./package.json"},"scripts":{"test":"node src/cli-entry.ts","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun --bun src/cli-entry.ts --type server","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b0ae6eee-6430-49d6-ba26-73f9227a56f6"}},"_resolved":"/tmp/d003290e5a3e604db35e7329b2bbe3d0/remix-run-test-0.4.1.tgz","_integrity":"sha512-5PzhLa1/B+TEgTJ46xJ0ytWUxDZjnkw40VbsXt82qta4GlrRFsoUif8kBfXWNyAyfdHWTBn+4/PqMeev5DYMRA==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/test"},"_npmVersion":"11.12.1","description":"A test framework for JavaScript and TypeScript projects","directories":{},"_nodeVersion":"24.15.0","dependencies":{"esbuild":"^0.27.1","get-tsconfig":"^4.13.6","magic-string":"^0.30.21","source-map-js":"^1.2.1","v8-to-istanbul":"^9.3.0","es-module-lexer":"^2.0.0","istanbul-reports":"^3.2.0","@remix-run/node-tsx":"^0.1.1","@remix-run/terminal":"^0.1.1","istanbul-lib-report":"^3.0.1","istanbul-lib-coverage":"^3.2.2"},"_hasShrinkwrap":false,"devDependencies":{"decamelize":"^6.0.1","playwright":"^1.59.0","@types/node":"^24.6.0","@remix-run/ui":"^0.2.0","@remix-run/assert":"^0.2.1","@types/dom-navigation":"1.0.6","@types/istanbul-reports":"^3.0.4","@types/istanbul-lib-report":"^3.0.3","@typescript/native-preview":"7.0.0-dev.20251125.1","@remix-run/node-fetch-server":"^0.13.3","@types/istanbul-lib-coverage":"^2.0.6"},"peerDependencies":{"playwright":"^1.59.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/test_0.4.1_1779308190536_0.3841870230819717","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@remix-run/test","version":"0.4.2","keywords":["testing","browser","test","remix","component","playwright"],"author":{"name":"Shopify Inc."},"license":"MIT","_id":"@remix-run/test@0.4.2","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/test#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"bin":{"remix-test":"dist/cli-entry.js"},"dist":{"shasum":"e5c0f3a4e6b1fd1059846e7388c8b52ad77ba6dd","tarball":"https://registry.npmjs.org/@remix-run/test/-/test-0.4.2.tgz","fileCount":166,"integrity":"sha512-zZKdAFR7pMKZoHXnCLyP0U2JZzowpPtguzRz/KQbADSkOEj6wiIjv+/ofiZ0GLRXrAh/xzocISR1AZsMVEx5vg==","signatures":[{"sig":"MEUCIECwju3IOmQj4lWTyl+TMQqeAOvoJYByihghyy+NgNarAiEAoAtPiCPkoproJtp59TUSOB1pw+oyYEeLFEpyh61WOJQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ftest@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":364782},"type":"module","_from":"file:remix-run-test-0.4.2.tgz","engines":{"node":">=24.3.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js"},"./package.json":"./package.json"},"scripts":{"test":"node src/cli-entry.ts","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun --bun src/cli-entry.ts --type server","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b0ae6eee-6430-49d6-ba26-73f9227a56f6"}},"_resolved":"/tmp/dda0d50806705f4a171591de27a61145/remix-run-test-0.4.2.tgz","_integrity":"sha512-zZKdAFR7pMKZoHXnCLyP0U2JZzowpPtguzRz/KQbADSkOEj6wiIjv+/ofiZ0GLRXrAh/xzocISR1AZsMVEx5vg==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/test"},"_npmVersion":"11.13.0","description":"A test framework for JavaScript and TypeScript projects","directories":{},"_nodeVersion":"24.16.0","dependencies":{"esbuild":"^0.27.1","get-tsconfig":"^4.13.6","magic-string":"^0.30.21","oxc-resolver":"^11.19.1","source-map-js":"^1.2.1","v8-to-istanbul":"^9.3.0","es-module-lexer":"^2.0.0","istanbul-reports":"^3.2.0","@remix-run/node-tsx":"^0.1.1","@remix-run/terminal":"^0.1.1","istanbul-lib-report":"^3.0.1","istanbul-lib-coverage":"^3.2.2"},"_hasShrinkwrap":false,"devDependencies":{"clsx":"2.1.1","decamelize":"6.0.1","playwright":"^1.60.0","@types/node":"^24.6.0","@remix-run/ui":"^0.3.0","@remix-run/assert":"^0.2.1","@types/dom-navigation":"1.0.6","@types/istanbul-reports":"^3.0.4","@types/istanbul-lib-report":"^3.0.3","@typescript/native-preview":"7.0.0-dev.20251125.1","@remix-run/node-fetch-server":"^0.13.3","@types/istanbul-lib-coverage":"^2.0.6"},"peerDependencies":{"playwright":"^1.60.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/test_0.4.2_1780078556377_0.41624152062372133","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@remix-run/test","version":"0.5.0","keywords":["testing","browser","test","remix","component","playwright"],"author":{"name":"Shopify Inc."},"license":"MIT","_id":"@remix-run/test@0.5.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/test#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"bin":{"remix-test":"dist/cli-entry.js"},"dist":{"shasum":"0a27977b8fe5a90a1390e34345adf3ebbcc8ec1d","tarball":"https://registry.npmjs.org/@remix-run/test/-/test-0.5.0.tgz","fileCount":166,"integrity":"sha512-jaJLJi7+YXFh4JblWe3hjqve8tkiZ1Nzsog1j6EwCEv814bHldCqBbFrajI69DUULd3nNCs3Mk3rz96lt83xYA==","signatures":[{"sig":"MEYCIQCTdSu7Ltimw1s8Z6h/WcrZBvDDDy4VImfkbApmBiZcpgIhAIMQPFCxzNsHBh4HTav3Rgu7xTwGwphpGmCx+Sy3h9Yk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ftest@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":387021},"type":"module","_from":"file:remix-run-test-0.5.0.tgz","engines":{"node":">=24.3.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js"},"./package.json":"./package.json"},"scripts":{"test":"node src/cli-entry.ts","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun --bun src/cli-entry.ts --type server","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b0ae6eee-6430-49d6-ba26-73f9227a56f6"}},"_resolved":"/tmp/ed6f54d4e144cc90de6d2db16e2574d3/remix-run-test-0.5.0.tgz","_integrity":"sha512-jaJLJi7+YXFh4JblWe3hjqve8tkiZ1Nzsog1j6EwCEv814bHldCqBbFrajI69DUULd3nNCs3Mk3rz96lt83xYA==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/test"},"_npmVersion":"11.13.0","description":"A test framework for JavaScript and TypeScript projects","directories":{},"_nodeVersion":"24.16.0","dependencies":{"esbuild":"^0.27.1","get-tsconfig":"^4.13.6","magic-string":"^0.30.21","oxc-resolver":"^11.19.1","source-map-js":"^1.2.1","v8-to-istanbul":"^9.3.0","es-module-lexer":"^2.0.0","istanbul-reports":"^3.2.0","@remix-run/node-tsx":"^0.1.1","@remix-run/terminal":"^0.1.1","istanbul-lib-report":"^3.0.1","istanbul-lib-coverage":"^3.2.2"},"_hasShrinkwrap":false,"devDependencies":{"clsx":"2.1.1","decamelize":"6.0.1","playwright":"^1.60.0","@types/node":"^24.6.0","@remix-run/ui":"^0.3.0","@remix-run/assert":"^0.3.0","@types/dom-navigation":"1.0.6","@types/istanbul-reports":"^3.0.4","@types/istanbul-lib-report":"^3.0.3","@typescript/native-preview":"7.0.0-dev.20251125.1","@remix-run/node-fetch-server":"^0.13.3","@types/istanbul-lib-coverage":"^2.0.6"},"peerDependencies":{"playwright":"^1.60.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/test_0.5.0_1780683905546_0.7982116196167113","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@remix-run/test","version":"0.6.0","keywords":["testing","browser","test","remix","component","playwright"],"author":{"name":"Shopify Inc."},"license":"MIT","_id":"@remix-run/test@0.6.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/test#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"765e67b9c7e87fb4f93af5e36819029dbe9b195d","tarball":"https://registry.npmjs.org/@remix-run/test/-/test-0.6.0.tgz","fileCount":162,"integrity":"sha512-1m35Okayxu0cdBGpyPucLdDvCgiAe4Unf1J6iigg2GAqwBhqy7K3+KKL08QNhwnBnSQBGca8wCcTp+6UJUa3jg==","signatures":[{"sig":"MEUCIQDII7JDlon8sV1vsPnKcWAzwvDKJ0Rb/bCqXo0+LLTB9AIgYy9mQP6NBwDzuJQMZNLc1uSYPazlvCuIV7LjTV2Fm6Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ftest@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":389881},"type":"module","_from":"file:remix-run-test-0.6.0.tgz","engines":{"node":">=24.3.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js"},"./package.json":"./package.json"},"scripts":{"test":"remix test","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix test --type server","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b0ae6eee-6430-49d6-ba26-73f9227a56f6"}},"_resolved":"/tmp/67739559ad1dfe483d114dff384ebe32/remix-run-test-0.6.0.tgz","_integrity":"sha512-1m35Okayxu0cdBGpyPucLdDvCgiAe4Unf1J6iigg2GAqwBhqy7K3+KKL08QNhwnBnSQBGca8wCcTp+6UJUa3jg==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/test"},"_npmVersion":"11.16.0","description":"A test framework for JavaScript and TypeScript projects","directories":{},"_nodeVersion":"24.18.0","dependencies":{"esbuild":"^0.27.1","get-tsconfig":"^4.13.6","magic-string":"^0.30.21","oxc-resolver":"^11.19.1","source-map-js":"^1.2.1","v8-to-istanbul":"^9.3.0","es-module-lexer":"^2.0.0","istanbul-reports":"^3.2.0","@remix-run/node-tsx":"^0.1.1","@remix-run/terminal":"^0.1.1","istanbul-lib-report":"^3.0.1","istanbul-lib-coverage":"^3.2.2"},"_hasShrinkwrap":false,"devDependencies":{"clsx":"2.1.1","decamelize":"6.0.1","playwright":"^1.60.0","typescript":"^7.0.2","@types/node":"^24.6.0","@remix-run/assert":"^0.3.0","@types/dom-navigation":"1.0.6","@types/istanbul-reports":"^3.0.4","@types/istanbul-lib-report":"^3.0.3","@remix-run/node-fetch-server":"^0.14.1","@types/istanbul-lib-coverage":"^2.0.6"},"peerDependencies":{"playwright":"^1.60.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/test_0.6.0_1786666057067_0.4479132557736285","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@remix-run/test","version":"0.6.1","keywords":["testing","browser","test","remix","component","playwright"],"author":{"name":"Shopify Inc."},"license":"MIT","_id":"@remix-run/test@0.6.1","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/test#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"082369f4d5380b92ca3784953490acaee84ccc23","tarball":"https://registry.npmjs.org/@remix-run/test/-/test-0.6.1.tgz","fileCount":162,"integrity":"sha512-Maa3zFYo+sO7QVY962OBaZWebHek8mgqDQSvxZ+aIuvDEL3IJYzZPwW8Rhniwply/cG+EJUMeiTmNFXuv503tA==","signatures":[{"sig":"MEQCIELDAR5yjExSOP/eUmeyK70ff0njmDpDfP/4KoUJSHiqAiBcdNwIhRTLB3I3t3fOHgc/5k1CLrnToz50lj+5VIMEnQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDABnrUB40uT2jvCHfA//yXoTPtWZKGSZixD9fscqYu5AiAgD+iIPvB0aIgi+ug7NFwxsnyLyKJ+rdr/sFwyeYf/SQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ftest@0.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":389915},"type":"module","_from":"file:/tmp/remix-publish-test-Jeu8i1/remix-run-test-0.6.1.tgz","engines":{"node":">=24.3.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js"},"./package.json":"./package.json"},"scripts":{"test":"remix test","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix test --type server","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b0ae6eee-6430-49d6-ba26-73f9227a56f6"}},"_resolved":"/tmp/remix-publish-test-Jeu8i1/remix-run-test-0.6.1.tgz","_integrity":"sha512-Maa3zFYo+sO7QVY962OBaZWebHek8mgqDQSvxZ+aIuvDEL3IJYzZPwW8Rhniwply/cG+EJUMeiTmNFXuv503tA==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/test"},"_npmVersion":"11.19.0","description":"A test framework for JavaScript and TypeScript projects","directories":{},"_nodeVersion":"24.20.0","dependencies":{"esbuild":"^0.27.1","get-tsconfig":"^4.13.6","magic-string":"^0.30.21","oxc-resolver":"^11.19.1","source-map-js":"^1.2.1","v8-to-istanbul":"^9.3.0","es-module-lexer":"^2.0.0","istanbul-reports":"^3.2.0","@remix-run/node-tsx":"^0.1.1","@remix-run/terminal":"^0.1.1","istanbul-lib-report":"^3.0.1","istanbul-lib-coverage":"^3.2.2"},"_hasShrinkwrap":false,"devDependencies":{"clsx":"2.1.1","decamelize":"6.0.1","playwright":"^1.60.0","typescript":"^7.0.2","@types/node":"^24.6.0","@remix-run/assert":"^0.3.0","@types/dom-navigation":"1.0.6","@types/istanbul-reports":"^3.0.4","@types/istanbul-lib-report":"^3.0.3","@remix-run/node-fetch-server":"^0.14.1","@types/istanbul-lib-coverage":"^2.0.6"},"peerDependencies":{"playwright":"^1.60.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/test_0.6.1_1789770854348_0.4046575886534147","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"@remix-run/test","version":"0.6.2","keywords":["testing","browser","test","remix","component","playwright"],"author":{"name":"Shopify Inc."},"license":"MIT","_id":"@remix-run/test@0.6.2","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/test#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"ad39a84586908f7493a075482551833491d4e5c5","tarball":"https://registry.npmjs.org/@remix-run/test/-/test-0.6.2.tgz","fileCount":162,"integrity":"sha512-GcdX0Ssv4EOEHt1JCRqNAFTRqQuzEqtDv6wgSHRpPF+gyUsihdDKace7NlH+0xiqdYEpZmcXOhT18+o2k0gGLw==","signatures":[{"sig":"MEUCIQCKnAIV4HqM4tRxMr66pVPOWL61ouHQZuadPMSk3kB2WQIgRKaVBRnjP3J7yBmAYiOAgdvAyUHrh38Tu83Avsx4Lro=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIE/70TEzwVLpfqd4yWP6DImbLmWyyBg9izM6BpvNy9dQAiANNICLfNWwHRq0Nt5NdGzH6zlP9PgHfURvSe1TbrD9UQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ftest@0.6.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":391229},"type":"module","_from":"file:/tmp/remix-publish-test-wV0LRW/remix-run-test-0.6.2.tgz","engines":{"node":">=24.3.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js"},"./package.json":"./package.json"},"scripts":{"test":"remix test","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix test --type server","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"b0ae6eee-6430-49d6-ba26-73f9227a56f6"}},"_resolved":"/tmp/remix-publish-test-wV0LRW/remix-run-test-0.6.2.tgz","_integrity":"sha512-GcdX0Ssv4EOEHt1JCRqNAFTRqQuzEqtDv6wgSHRpPF+gyUsihdDKace7NlH+0xiqdYEpZmcXOhT18+o2k0gGLw==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/test"},"_npmVersion":"11.19.0","description":"A test framework for JavaScript and TypeScript projects","directories":{},"sideEffects":["./src/app/client/entry.ts","./src/app/client/iframe.ts","./src/lib/framework.ts","./src/lib/worker-e2e.ts","./src/lib/worker-process.ts","./src/lib/worker.ts","./src/test/coverage/test-browser.ts","./src/test/coverage/test-e2e.ts","./src/test/coverage/test-unit.ts","./dist/app/client/entry.js","./dist/app/client/iframe.js","./dist/lib/framework.js","./dist/lib/worker-e2e.js","./dist/lib/worker-process.js","./dist/lib/worker.js","./dist/test/coverage/test-browser.js","./dist/test/coverage/test-e2e.js","./dist/test/coverage/test-unit.js"],"_nodeVersion":"24.21.0","dependencies":{"esbuild":"^0.27.1","get-tsconfig":"^4.13.6","magic-string":"^0.30.21","oxc-resolver":"^11.19.1","source-map-js":"^1.2.1","v8-to-istanbul":"^9.3.0","es-module-lexer":"^2.0.0","istanbul-reports":"^3.2.0","@remix-run/node-tsx":"^0.1.2","@remix-run/terminal":"^0.1.2","istanbul-lib-report":"^3.0.1","istanbul-lib-coverage":"^3.2.2"},"_hasShrinkwrap":false,"devDependencies":{"clsx":"2.1.1","decamelize":"6.0.1","playwright":"^1.60.0","typescript":"^7.0.2","@types/node":"^24.6.0","@remix-run/assert":"^0.3.1","@types/dom-navigation":"1.0.6","@types/istanbul-reports":"^3.0.4","@types/istanbul-lib-report":"^3.0.3","@remix-run/node-fetch-server":"^0.14.2","@types/istanbul-lib-coverage":"^2.0.6"},"peerDependencies":{"playwright":"^1.60.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/test_0.6.2_1790631745358_0.9837582766243669","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"_id":"@remix-run/test@1.0.0","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"fd1af99135b0fb5befe9ae5811eac6827710e186","tarball":"https://registry.npmjs.org/@remix-run/test/-/test-1.0.0.tgz","fileCount":162,"integrity":"sha512-+thIAxJuQc8HRIQnfCxFK0t57qHo1mDDL6MIkBmJoJCNCgNR4IH/gERDZesELokq/0wd7pRn/yzkEX8g7oIoCw==","signatures":[{"sig":"MEUCIDg4gZO2b0utoHB2gbjoOTlgd7lRLyAbYcgUEEVZnnsOAiEA5ETLGBuhuddinIaC76adYQS7awOoVMgNVwA5r6CAwNU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCIB3aYL6v89X+jO74bzqytTme0TAEti+1Yofzae4kUHgIgHD8VKnDbllzsf6mlgDKayeIXj6yxgpM31zcHgpkOZ3E="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ftest@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":391270},"name":"@remix-run/test","type":"module","_from":"file:/tmp/remix-publish-test-f9WAoo/remix-run-test-1.0.0.tgz","author":{"name":"Shopify Inc."},"engines":{"node":">=24.3.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js"},"./package.json":"./package.json"},"license":"MIT","scripts":{"test":"remix test","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix test --type server","typecheck":"tsc --noEmit"},"version":"1.0.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"b0ae6eee-6430-49d6-ba26-73f9227a56f6"}},"homepage":"https://github.com/remix-run/remix/tree/main/packages/test#readme","keywords":["testing","browser","test","remix","component","playwright"],"_resolved":"/tmp/remix-publish-test-f9WAoo/remix-run-test-1.0.0.tgz","_integrity":"sha512-+thIAxJuQc8HRIQnfCxFK0t57qHo1mDDL6MIkBmJoJCNCgNR4IH/gERDZesELokq/0wd7pRn/yzkEX8g7oIoCw==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/test"},"_npmVersion":"11.19.0","description":"A test framework for JavaScript and TypeScript projects","directories":{},"maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"sideEffects":["./src/app/client/entry.ts","./src/app/client/iframe.ts","./src/lib/framework.ts","./src/lib/worker-e2e.ts","./src/lib/worker-process.ts","./src/lib/worker.ts","./src/test/coverage/test-browser.ts","./src/test/coverage/test-e2e.ts","./src/test/coverage/test-unit.ts","./dist/app/client/entry.js","./dist/app/client/iframe.js","./dist/lib/framework.js","./dist/lib/worker-e2e.js","./dist/lib/worker-process.js","./dist/lib/worker.js","./dist/test/coverage/test-browser.js","./dist/test/coverage/test-e2e.js","./dist/test/coverage/test-unit.js"],"_nodeVersion":"24.21.0","dependencies":{"esbuild":"^0.27.1","get-tsconfig":"^4.13.6","magic-string":"^0.30.21","oxc-resolver":"^11.19.1","source-map-js":"^1.2.1","v8-to-istanbul":"^9.3.0","es-module-lexer":"^2.0.0","istanbul-reports":"^3.2.0","@remix-run/node-tsx":"^1.0.0","@remix-run/terminal":"^1.0.0","istanbul-lib-report":"^3.0.1","istanbul-lib-coverage":"^3.2.2"},"_hasShrinkwrap":false,"devDependencies":{"clsx":"2.1.1","decamelize":"6.0.1","playwright":"^1.60.0","typescript":"^7.0.2","@types/node":"^24.6.0","@remix-run/assert":"^1.0.0","@types/dom-navigation":"1.0.6","@types/istanbul-reports":"^3.0.4","@types/istanbul-lib-report":"^3.0.3","@remix-run/node-fetch-server":"^1.0.0","@types/istanbul-lib-coverage":"^2.0.6"},"peerDependencies":{"playwright":"^1.60.0"},"peerDependenciesMeta":{"playwright":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/test_1.0.0_1790895279388_0.962305202861578"}}},"time":{"created":"2026-04-21T23:50:55.636Z","modified":"2026-10-01T22:54:39.829Z","0.0.0":"2026-04-21T23:50:55.911Z","0.1.0":"2026-04-23T00:37:19.236Z","0.2.0":"2026-04-29T17:29:21.607Z","0.3.0":"2026-04-30T19:10:37.353Z","0.4.0":"2026-05-20T03:20:25.596Z","0.4.1":"2026-05-20T20:16:30.693Z","0.4.2":"2026-05-29T18:15:56.525Z","0.5.0":"2026-06-05T18:25:05.679Z","0.6.0":"2026-08-14T00:07:37.285Z","0.6.1":"2026-09-18T22:34:14.448Z","0.6.2":"2026-09-28T21:42:25.468Z","1.0.0":"2026-10-01T22:54:39.470Z"},"bugs":{"url":"https://github.com/remix-run/remix/issues"},"author":{"name":"Shopify Inc."},"license":"MIT","homepage":"https://github.com/remix-run/remix/tree/main/packages/test#readme","keywords":["testing","browser","test","remix","component","playwright"],"repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/test"},"description":"A test framework for JavaScript and TypeScript projects","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"readme":"# test\n\nA test framework for JavaScript and TypeScript projects.\n\n## Features\n\n- `describe`/`it` test structure with `before`/`after`/`beforeEach`/`afterEach` hooks\n- Server-side unit testing\n- Playwright E2E testing via `t.serve`\n- In-browser component testing (pair with `render` from `remix/component/test`)\n- Mock functions and method spies via `t.mock.fn` / `t.mock.method`\n- Per-test and hook timeouts with `t.signal` abort support\n- Unified code coverage reporting across unit and E2E tests\n- Watch mode\n- Static CLI configuration through `remix.json`\n\n## Installation\n\n```sh\nnpm i remix\n```\n\n## Usage\n\nWrite test files that import from `remix/test`:\n\n```ts\nimport * as assert from 'remix/assert'\nimport { describe, it } from 'remix/test'\n\ndescribe('My Test Suite', () => {\n  it('tests a function', () => {\n    let result = something()\n    assert.equal(result, 42)\n  })\n})\n```\n\nRun tests with the CLI:\n\n```sh\nremix test\n```\n\nBy default, `remix test` discovers all files matching `**/*.test{,.browser,.e2e}.{ts,tsx}`. Pass a partial filename to select matching test files:\n\n```sh\nremix test frame\nremix test frame router\n```\n\nSimple names expand to test globs: `frame` becomes `**/*frame*.test*.{ts,tsx}`, selecting files such as `src/frame.test.ts` and `src/frame.css.test.tsx` while ignoring source files such as `src/frame.ts`. Arguments containing glob syntax, a path separator, or a `.ts` or `.tsx` file extension pass through unchanged.\n\nYou can also pass file paths and explicit globs:\n\n```sh\nremix test \"src/**/*.test.ts\"\nremix test \"src/**/*.test.ts\" \"tests/**/*.test.tsx\"\nremix test src/frame.test.ts\n```\n\nYou can combine simple names, file paths, and globs; matching files run once. The `--glob.*` flags are repeatable. Positional arguments, including expanded names, override configured test globs and `--glob.test`. Exclusions still apply. Use an explicit glob for custom naming conventions such as `*.spec.ts`.\n\n### Config File\n\nCreate an optional `remix.json` at the root of your project. It is parsed as JSONC, so comments and\ntrailing commas are allowed:\n\n```jsonc\n{\n  \"$schema\": \"./node_modules/remix/schema/remix.json\",\n  \"test\": {\n    \"files\": [\"**/*.test{,.browser,.e2e}.{ts,tsx}\"],\n    \"browserFiles\": [\"**/*.test.browser.{ts,tsx}\"],\n    \"e2eFiles\": [\"**/*.test.e2e.{ts,tsx}\"],\n    \"exclude\": [\"node_modules/**\", \"dist/**\"],\n    \"type\": [\"server\", \"browser\", \"e2e\"],\n    \"only\": [\"/checkout/i\"],\n\n    \"concurrency\": 2,\n    \"pool\": \"forks\",\n    \"setup\": \"./test/setup.ts\",\n    \"watch\": false,\n\n    \"playwright\": {\n      \"echo\": false,\n      \"open\": false,\n      \"configFile\": \"./playwright.config.ts\",\n      \"projects\": [\"chromium\", \"firefox\"],\n    },\n\n    \"reporter\": \"spec\",\n    \"quiet\": false,\n\n    \"coverage\": {\n      \"enabled\": true,\n      \"dir\": \".coverage\",\n      \"include\": [\"src/**\"],\n      \"exclude\": [\"src/**/*.test.ts\"],\n      \"statements\": 80,\n      \"lines\": 80,\n      \"branches\": 80,\n      \"functions\": 80,\n    },\n  },\n}\n```\n\nEvery field is optional. Relative paths and globs resolve from the directory containing the config\nfile. Explicit CLI flags and positional globs take precedence. Repeatable flags replace configured\narrays, and nested Playwright and coverage values merge by field.\n\n`remix-test.config.ts` and `remix-test.config.js` are no longer discovered. Move their static values\nunder `remix.json#test`. Move inline Playwright configuration into `playwright.config.ts` and point\n`playwright.configFile` at it. Use slash-delimited strings for regular expressions, and use CLI flags\nor package scripts for environment-specific overrides.\n\n### CLI Options\n\nUse the global `--config` flag to select another Remix config file. The flag path resolves from the\ncurrent working directory:\n\n```sh\nremix test --config ./config/remix.ci.json\n```\n\nYou may specify any test setting as a CLI flag. Boolean settings have negative forms so configured\n`true` values can be disabled explicitly:\n\n| Flag                        | Short |\n| --------------------------- | ----- |\n| `--browser.echo`            |       |\n| `--no-browser.echo`         |       |\n| `--browser.open`            |       |\n| `--no-browser.open`         |       |\n| `--concurrency <n>`         | `-c`  |\n| `--coverage`                |       |\n| `--no-coverage`             |       |\n| `--coverage.dir <path>`     |       |\n| `--coverage.include`        |       |\n| `--coverage.exclude`        |       |\n| `--coverage.statements`     |       |\n| `--coverage.lines`          |       |\n| `--coverage.branches`       |       |\n| `--coverage.functions`      |       |\n| `--glob.test`               |       |\n| `--glob.browser`            |       |\n| `--glob.e2e`                |       |\n| `--glob.exclude`            |       |\n| `--playwrightConfig <path>` |       |\n| `--only <pattern>`          |       |\n| `--pool <forks\\|threads>`   |       |\n| `--project <name>`          | `-p`  |\n| `--quiet`                   | `-q`  |\n| `--no-quiet`                |       |\n| `--reporter <name>`         | `-r`  |\n| `--setup <path>`            | `-s`  |\n| `--type <name>`             | `-t`  |\n| `--watch`                   | `-w`  |\n| `--no-watch`                |       |\n\nThe standalone `remix-test` executable is no longer installed. Update scripts to use the main Remix CLI:\n\n```diff\n- \"test\": \"remix-test --type server\"\n+ \"test\": \"remix test --type server\"\n```\n\n### Focusing Tests\n\nUse `.only` to focus a suite or test while developing:\n\n```ts\ndescribe.only('Cart routes', () => {\n  it('loads cart items', () => {})\n})\n\ndescribe('Checkout routes', () => {\n  it.only('redirects anonymous users', () => {})\n})\n```\n\nUse `--only <pattern>` to focus tests from the CLI without editing source. Plain patterns are case-insensitive JavaScript regular expressions matched against suite names and full test names:\n\n```sh\nremix test --only 'Cart routes'\nremix test --only 'Checkout routes > redirects anonymous users'\nremix test --only '/anonymous users$/'\n```\n\nSlash-delimited CLI and `remix.json` patterns preserve their flags, so `/pattern/` is case-sensitive and `/pattern/i` is case-insensitive. Plain string patterns are case-insensitive. Programmatic callers may also pass `RegExp` values.\n\nFull test names join nested `describe` names and the test name with `>`. For example, `describe('Cart routes', () => describe('loader', () => it('loads cart items', ...)))` has the full test name `Cart routes > loader > loads cart items`.\n\n### Setup\n\nThe `setup` option points to a module that can export `globalSetup` and/or `globalTeardown` functions, called once before and after the entire test run respectively:\n\n```ts\n// ./test/setup.ts\nexport async function globalSetup() {\n  await db.migrate()\n}\n\nexport async function globalTeardown() {\n  await db.close()\n}\n```\n\n## API\n\n### Test framework\n\n```ts\nimport { beforeAll, afterAll, beforeEach, afterEach, describe, it } from 'remix/test'\n\nbeforeAll(() => {})\nafterAll(() => {})\n\ndescribe('My Test Suite', () => {\n  beforeEach(() => {})\n  afterEach(() => {})\n\n  it('tests something', () => {})\n  it('skips with a reason', { skip: 'requires API credentials' }, () => {})\n  it('tracks planned work', { todo: 'add retry coverage' }, () => {})\n  it('fails if it takes too long', { timeout: 5_000 }, async (t) => {\n    await fetchSomething({ signal: t.signal })\n  })\n  it('tests something else', () => {})\n})\n```\n\n`suite` and `test` are aliases for `describe` and `it`.\n\n```ts\nimport { suite, test } from 'remix/test'\n\nsuite('My Test Suite', () => {\n  test('tests something', () => {})\n})\n```\n\n### Programmatic runner\n\n`remix/test/cli` exports `runRemixTest()` for tools that want to run the test runner without exiting the current process:\n\n```ts\nimport { runRemixTest } from 'remix/test/cli'\n\nlet exitCode = await runRemixTest({\n  concurrency: 1,\n  cwd: process.cwd(),\n  glob: { test: 'src/**/*.test.ts' },\n  type: ['server'],\n})\n```\n\nThe programmatic runner accepts structured options only; it does not discover or load configuration\nfiles. Programmatic callers may pass richer values such as an inline Playwright config or `RegExp`\ntest-name filters. The main Remix CLI owns `remix.json` loading and passes the resolved options to the\nrunner.\n\n`runRemixTest()` does not read `process.argv` or terminate the process; it returns the runner exit code. The main `remix` executable owns argument parsing and passes the final code to `process.exit()` so open workers, browsers, or project handles cannot keep the CLI alive. `@remix-run/test` does not install a standalone executable.\n\n### Test Context\n\nEach test callback receives a `TestContext` (`t`) as its first argument with helpful test utilities.\n\n```ts\n// from 'remix/test'\ninterface TestContext {\n  // Aborts when the test times out or when the user-provided test signal aborts\n  signal: AbortSignal\n\n  // Register a cleanup function to run after the test completes\n  after(fn: () => void): void\n\n  // Mock tracker, mirroring the shape of Node's `t.mock` from `node:test`\n  mock: {\n    // Create a mock function with an optional implementation\n    fn<T extends (...args: any[]) => any>(impl?: T): MockFunction<T>\n\n    // Mock an object method with an optional implementation override\n    method<T extends object, K extends keyof T>(\n      obj: T,\n      methodName: K,\n      impl?: Function,\n    ): MockFunction\n  }\n\n  // Replace global timer functions with controllable fakes\n  useFakeTimers(): FakeTimers\n\n  // E2E only: connect a running test server to a Playwright Page\n  serve(server: { baseUrl: string; close(): Promise<void> }): Promise<Page>\n}\n```\n\n#### Mocks and Spies\n\nUse `t.mock.fn()`/`t.mock.method()` to set up mocks and method spies. This is preferred over the standalone `mock` import because TestContext method mocks are automatically restored after the test runs.\n\n```ts\nit('mocks and spies', (t) => {\n  // Create a mock function\n  let fn = t.mock.fn((x: number) => x * 2)\n  fn(3)\n  fn.mock.calls[0].result // 6\n\n  // Mock an existing method\n  let spy = t.mock.method(console, 'warn')\n  console.warn('test')\n  spy.mock.calls.length // 1\n  // spy is restored automatically when the test ends\n})\n```\n\n#### Cleanup\n\nYou can register local test cleanup logic with `t.after()`:\n\n```ts\nit('cleanup', (t) => {\n  let conn = db.connect()\n  t.after(() => conn.close())\n  // ...\n})\n```\n\n#### Timeouts and Signals\n\nPass `{ timeout: ms }` to `it()` or after any lifecycle hook callback to fail that work if it takes too long. Timed-out tests abort `t.signal`, so async code that accepts an `AbortSignal` can cancel promptly.\n\n```ts\nit('loads data', { timeout: 5_000 }, async (t) => {\n  let response = await fetch('/api/data', { signal: t.signal })\n  assert.equal(response.status, 200)\n})\n\nbeforeEach(\n  async () => {\n    await resetDatabase()\n  },\n  { timeout: 1_000 },\n)\n```\n\n#### Fake Timers\n\n`t.useFakeTimers()` replaces the global timer functions (`setTimeout`, `setInterval`, etc.) with controllable fakes that are automatically restored after the test. It works in any test environment — server unit tests, browser tests, or E2E setup code.\n\n```ts\nit('debounces a callback', (t) => {\n  let timers = t.useFakeTimers()\n  let calls = 0\n  let debounced = debounce(() => calls++, 300)\n\n  debounced()\n  timers.advance(299)\n  assert.equal(calls, 0)\n  timers.advance(1)\n  assert.equal(calls, 1)\n})\n```\n\n| Method        | Description                                                                 |\n| ------------- | --------------------------------------------------------------------------- |\n| `advance(ms)` | Advance the clock by `ms` milliseconds, firing any elapsed timers           |\n| `restore()`   | Restore the original timer functions (called automatically after each test) |\n\n#### E2E\n\nIn E2E test files, `t.serve()` connects a running test server to a Playwright `Page`. See [E2E Testing](#e2e-testing) for details.\n\n```ts\nimport { createTestServer } from 'remix/node-fetch-server/test'\n\nit('navigates to home', async (t) => {\n  let router = createRouter()\n  let server = await createTestServer(router.fetch)\n  let page = await t.serve(server)\n  await page.goto('/')\n})\n```\n\n### Standalone mocks (module scope)\n\nWhen you need a mock outside of a test body, import `mock` directly and call `restore()` manually:\n\n```ts\nimport { mock } from 'remix/test'\n\nlet spy = mock.method(console, 'log')\n// ...\nspy.mock.restore?.()\n```\n\n### Browser Testing\n\nBrowser tests run components in an actual browser environment via Playwright and are discovered by the `**/*.test.browser.{ts,tsx}` glob pattern (configurable via `glob.browser`). They use the same `describe`/`it` API as unit tests. Each in-browser test suite runs in an isolated `iframe` so it has access to its own `document` instance.\n\n#### `render()`\n\n`render`, exported from `remix/component/test`, mounts a component into the DOM and returns a `RenderResult`:\n\n```ts\nimport * as assert from 'remix/assert'\nimport { describe, it } from 'remix/test'\nimport { render } from 'remix/component/test'\nimport { Counter } from './counter.tsx'\n\ndescribe('Counter', () => {\n  it('increments on click', async (t) => {\n    let { $, act, cleanup } = render(<Counter />)\n    t.after(cleanup)\n\n    assert.equal($('[data-count]')?.textContent, '0')\n    await act(() => $('[data-action=\"increment\"]')?.click())\n    assert.equal($('[data-count]')?.textContent, '1')\n  })\n})\n```\n\n`RenderResult` provides:\n\n| Property/Method | Description                                                             |\n| --------------- | ----------------------------------------------------------------------- |\n| `container`     | The `HTMLElement` the component is mounted into                         |\n| `root`          | The Remix `VirtualRoot` the component is rendered in                    |\n| `$(selector)`   | Alias for `container.querySelector()`                                   |\n| `$$(selector)`  | Alias for `container.querySelectorAll()`                                |\n| `act(fn)`       | Runs `fn` and flushes pending component updates                         |\n| `cleanup()`     | Unmounts and removes the container (pass to `t.after` for auto-cleanup) |\n\n### E2E Testing\n\nEnd-to-end (E2E) tests use [Playwright](https://playwright.dev) and are discovered by the `**/*.test.e2e.{ts,tsx}` glob pattern (configurable via `glob.e2e`). They use the same `describe`/`it` API as unit tests.\n\nE2E tests receive `t.serve()` on the test context, which accepts a running test server and returns a Playwright [`Page`](https://playwright.dev/docs/api/class-page) whose `baseURL` points at that server. The server and page are automatically closed after each test.\n\n```ts\nimport * as assert from 'remix/assert'\nimport { createTestServer } from 'remix/node-fetch-server/test'\nimport { describe, it } from 'remix/test'\nimport { createRouter } from './router.ts'\n\ndescribe('checkout', () => {\n  it('adds an item to the cart', async (t) => {\n    let router = createRouter()\n    let server = await createTestServer(router.fetch)\n    let page = await t.serve(server)\n\n    await page.goto('/')\n    await page.getByRole('button', { name: 'Add to Cart' }).click()\n    await page.getByRole('link', { name: 'Cart' }).click()\n    await page.getByRole('heading', { name: 'Shopping Cart' }).waitFor()\n\n    assert.equal(await page.locator('[data-test-cart-quantity]').innerText(), 1)\n  })\n})\n```\n\nConfigure Playwright's browsers, timeouts, viewport, and other executable settings in\n`playwright.config.ts`:\n\n```ts\nimport { defineConfig } from 'playwright/test'\n\nexport default defineConfig({\n  projects: [\n    { name: 'chromium', use: { browserName: 'chromium' } },\n    { name: 'firefox', use: { browserName: 'firefox' } },\n    { name: 'webkit', use: { browserName: 'webkit' } },\n  ],\n  use: {\n    navigationTimeout: 5_000,\n    actionTimeout: 5_000,\n  },\n})\n```\n\nReference it from `remix.json` when it is not at the default location:\n\n```jsonc\n{\n  \"test\": {\n    \"playwright\": {\n      \"configFile\": \"./playwright.config.ts\",\n    },\n  },\n}\n```\n\nSet `test.playwright.open` to `true`, or pass `--browser.open`, to keep the browser open after tests\nfinish—useful for debugging failures.\n\n## Related Packages\n\n- [`assert`](https://github.com/remix-run/remix/tree/main/packages/assert) provides assertions that work in server and browser tests.\n- [`component`](https://github.com/remix-run/remix/tree/main/packages/component) provides the `remix/component/test` browser rendering utilities.\n\n## Related Work\n\n- [Playwright](https://playwright.dev) provides the browser automation used by browser and E2E tests.\n- [Node.js test runner](https://nodejs.org/api/test.html) provides prior art for the test framework API and reporting model.\n\n## License\n\nSee [LICENSE](https://github.com/remix-run/remix/blob/main/LICENSE)\n","readmeFilename":"README.md"}