{"_id":"@remix-run/spa","_rev":"4-3364e70df556109db70fa431b1ac0b8c","name":"@remix-run/spa","dist-tags":{"latest":"0.1.2"},"versions":{"0.0.0":{"name":"@remix-run/spa","version":"0.0.0","license":"MIT","_id":"@remix-run/spa@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":"c657149e65650fb4fce746df4290499e493aac00","tarball":"https://registry.npmjs.org/@remix-run/spa/-/spa-0.0.0.tgz","fileCount":2,"integrity":"sha512-WqTxwypYmiSiDq/Z1uO8sqfp20OAS/2vgl9gq7gTJP0KjRnSrkBERrx3ERUpM8VpWtERNOqIYXdpjoAwlRsQ5Q==","signatures":[{"sig":"MEQCIBBs7WKmHIKcHAB39dHGg2TCmwnZm8aIidrO4NXtrp71AiBk5oR9eEp430Trq9d8CISQoPP6DEJTz4+C9POMuWnXVQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":453},"_npmUser":{"name":"mjackson","email":"mjijackson+npm@gmail.com"},"repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/spa"},"_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/spa_0.0.0_1788201281754_0.5613325574252126","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@remix-run/spa","version":"0.1.0","keywords":["remix","spa","router","client","browser"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/spa@0.1.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/spa#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"29846b966c22d621b50fdcc61f2450b06ccf6f10","tarball":"https://registry.npmjs.org/@remix-run/spa/-/spa-0.1.0.tgz","fileCount":11,"integrity":"sha512-WJudc3XjY++LQbD18xHqXVWP5140AqSrcZYXU4dbxbNtz7+yEhG9c+XMDS6vuNA927s81NNJ0Ijx9cbWfqNoZg==","signatures":[{"sig":"MEUCIQD7zsccR8nweT5Dt/rkvPTPlVbWmiBDkz/XlxXcYu65fwIgd0qzUmfnwGo53pE3rQcyW6IBcxm8zFL2lkCeaKerqqk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fspa@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":19680},"type":"module","_from":"file:/tmp/remix-publish-spa-SBdabK/remix-run-spa-0.1.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.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","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:091dcc9d-f856-4a7c-910d-a3a0cc970850"}},"_resolved":"/tmp/remix-publish-spa-SBdabK/remix-run-spa-0.1.0.tgz","_integrity":"sha512-WJudc3XjY++LQbD18xHqXVWP5140AqSrcZYXU4dbxbNtz7+yEhG9c+XMDS6vuNA927s81NNJ0Ijx9cbWfqNoZg==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/spa"},"_npmVersion":"11.17.0","description":"Client-rendered application routing for Remix","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@remix-run/ui":"^0.8.0","@remix-run/fetch-router":"^0.21.0","@remix-run/render-middleware":"^0.2.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^24.6.0","@remix-run/test":"^0.6.0","@remix-run/assert":"^0.3.0","@types/dom-navigation":"^1.0.7"},"_npmOperationalInternal":{"tmp":"tmp/spa_0.1.0_1788202670910_0.3670399962695903","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@remix-run/spa","version":"0.1.1","keywords":["remix","spa","router","client","browser"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/spa@0.1.1","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/spa#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"bafa5b12f9054f0280aca2ba088b6b305ea6c187","tarball":"https://registry.npmjs.org/@remix-run/spa/-/spa-0.1.1.tgz","fileCount":11,"integrity":"sha512-mnvssAWmzb/kcVz5fIDwO/zAECumWZBcsXnQhMKVoPmb6ZuqVuqYYfmoufOZ8N7w1Q00YuVM71x9KNIS4tBMUQ==","signatures":[{"sig":"MEUCIQClL+OY0y8FsmpehQlXErs3jry+4pOsVVytNQvdQTqKrwIgHr26E95srMbcM0suQOmTGUDlNK+Mj7vhWS2bdntfgnc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fspa@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":19680},"type":"module","_from":"file:/tmp/remix-publish-spa-pX92ss/remix-run-spa-0.1.1.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.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","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:091dcc9d-f856-4a7c-910d-a3a0cc970850"}},"_resolved":"/tmp/remix-publish-spa-pX92ss/remix-run-spa-0.1.1.tgz","_integrity":"sha512-mnvssAWmzb/kcVz5fIDwO/zAECumWZBcsXnQhMKVoPmb6ZuqVuqYYfmoufOZ8N7w1Q00YuVM71x9KNIS4tBMUQ==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/spa"},"_npmVersion":"11.19.0","description":"Client-rendered application routing for Remix","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@remix-run/ui":"^0.9.0","@remix-run/fetch-router":"^0.22.0","@remix-run/render-middleware":"^0.3.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^24.6.0","@remix-run/test":"^0.6.0","@remix-run/assert":"^0.3.0","@types/dom-navigation":"^1.0.7"},"_npmOperationalInternal":{"tmp":"tmp/spa_0.1.1_1788908686366_0.6500635716612777","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"_id":"@remix-run/spa@0.1.2","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"c3720bdae0ce43c5e50764f704cf30a464cdbddd","tarball":"https://registry.npmjs.org/@remix-run/spa/-/spa-0.1.2.tgz","fileCount":11,"integrity":"sha512-SENjl7/Qtd7PYMG7kkOCGwJCVj3Hm2QHy1sMp1MA3qvIUkMHN/2d1wrR1bwaZwpUbmSQGnl32uie1Q4gkcNNwA==","signatures":[{"sig":"MEUCICtyNLTJgsLmZzPpaW4SJnxx2+rbEYgPAa8v5MeDf+1tAiEA051yN2an24e4iRUtS2RdCMvLZUV66EAm9bLeuEBzx8Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDYybNsQqYMQU6kDv9goNEMv1FGozwJNbjKCGEQHv5Z7gIgIa8N9+WOPlC4nm61sVj4jLbW9Wu3tSzK+Z2/jEdJJ3E="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fspa@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":19681},"name":"@remix-run/spa","type":"module","_from":"file:/tmp/remix-publish-spa-II8ijY/remix-run-spa-0.1.2.tgz","author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.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","typecheck":"tsc --noEmit"},"version":"0.1.2","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:091dcc9d-f856-4a7c-910d-a3a0cc970850"}},"homepage":"https://github.com/remix-run/remix/tree/main/packages/spa#readme","keywords":["remix","spa","router","client","browser"],"_resolved":"/tmp/remix-publish-spa-II8ijY/remix-run-spa-0.1.2.tgz","_integrity":"sha512-SENjl7/Qtd7PYMG7kkOCGwJCVj3Hm2QHy1sMp1MA3qvIUkMHN/2d1wrR1bwaZwpUbmSQGnl32uie1Q4gkcNNwA==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/spa"},"_npmVersion":"11.19.0","description":"Client-rendered application routing for Remix","directories":{},"maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"_nodeVersion":"24.20.0","dependencies":{"@remix-run/ui":"^0.10.0","@remix-run/fetch-router":"^0.22.1","@remix-run/render-middleware":"^0.3.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^24.6.0","@remix-run/test":"^0.6.1","@remix-run/assert":"^0.3.0","@types/dom-navigation":"^1.0.7"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/spa_0.1.2_1789770960677_0.2243864863102798"}}},"time":{"created":"2026-08-31T18:34:41.564Z","modified":"2026-09-18T22:36:01.258Z","0.0.0":"2026-08-31T18:34:41.880Z","0.1.0":"2026-08-31T18:57:51.053Z","0.1.1":"2026-09-08T23:04:46.519Z","0.1.2":"2026-09-18T22:36:00.828Z"},"bugs":{"url":"https://github.com/remix-run/remix/issues"},"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","homepage":"https://github.com/remix-run/remix/tree/main/packages/spa#readme","keywords":["remix","spa","router","client","browser"],"repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/spa"},"description":"Client-rendered application routing for Remix","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"readme":"# spa\n\nClient-rendered application routing for Remix. It connects a standard fetch router to the browser\nUI runtime without exposing the response carrier used to associate route responses with Remix\nnodes.\n\n## Features\n\n- **Standard fetch routing** - Preserve `Request` to `Response` dispatch, redirects, status codes,\n  headers, middleware, and cancellation\n- **Node rendering middleware** - Render `RemixNode` values through `context.render()`\n- **Browser runtime** - Resolve the current URL and future frame navigations through the router\n- **Initial fallback** - Display an interactive Remix node while the first route loads\n\n## Installation\n\n```sh\nnpm i remix\n```\n\n## Usage\n\nInstall `render()` before middleware and route handlers that use `context.render()`, then pass the\nrouter to `run()`.\n\n```tsx\nimport { createRouter } from 'remix/router'\nimport { get, route } from 'remix/routes'\nimport { render, run } from 'remix/spa'\n\nconst routes = route({\n  home: get('/'),\n  about: get('/about'),\n})\n\nconst router = createRouter({\n  middleware: [render()],\n  defaultHandler({ render }) {\n    return render(<h1>Not Found</h1>, { status: 404 })\n  },\n})\n\nrouter.map(routes, {\n  actions: {\n    home({ render }) {\n      return render(<h1>Home</h1>)\n    },\n    about({ render }) {\n      return render(<h1>About</h1>)\n    },\n  },\n})\n\nconst app = run(router, { fallback: <p>Loading…</p> })\nawait app.ready()\n```\n\nThe router remains an ordinary fetch router, so its normal actions, controllers, middleware, and\ncontext typing continue to apply.\n\n## Wrapping Route Content\n\nPass a request-aware transform to `render()` when every route should share an application shell.\n\n```tsx\nconst router = createRouter({\n  middleware: [\n    render((content, { url }) => (\n      <main data-pathname={url.pathname}>\n        <nav>{/* ... */}</nav>\n        {content}\n      </main>\n    )),\n  ],\n})\n```\n\n## Related Packages\n\n- [`fetch-router`](https://github.com/remix-run/remix/tree/main/packages/fetch-router) - Request\n  routing, controllers, and middleware context\n- [`render-middleware`](https://github.com/remix-run/remix/tree/main/packages/render-middleware) -\n  Request-scoped renderer middleware\n- [`ui`](https://github.com/remix-run/remix/tree/main/packages/ui) - Remix components, frames, and\n  browser runtime\n\n## Related Work\n\n- [Fetch standard](https://fetch.spec.whatwg.org/) - The request and response model preserved by SPA\n  routers\n- [Navigation API](https://wicg.github.io/navigation-api/) - Browser navigation lifecycle used by\n  the Remix UI runtime\n\n## License\n\nSee [LICENSE](https://github.com/remix-run/remix/blob/main/LICENSE)\n","readmeFilename":"README.md"}