{"_id":"@canmi/seam-router","_rev":"6-f2e73e508a3544600464f3403438f84f","name":"@canmi/seam-router","dist-tags":{"latest":"0.5.38"},"versions":{"0.4.18":{"name":"@canmi/seam-router","version":"0.4.18","license":"MIT","_id":"@canmi/seam-router@0.4.18","maintainers":[{"name":"canmi","email":"t@canmi.icu"}],"bin":{"seam-router-generate":"dist/cli.js"},"dist":{"shasum":"2a974c0a449883be7a793b3f9e526d07b132a341","tarball":"https://registry.npmjs.org/@canmi/seam-router/-/seam-router-0.4.18.tgz","fileCount":11,"integrity":"sha512-g3ZPaW5fYRKMojxipFr1sE3iKjDRdszJ0SnquIUkMLZN+T2wU8JDhBEty/Y1lQS16+/PGfndNkkVbSj83jVu+Q==","signatures":[{"sig":"MEYCIQDFnapCVTOETebJGzmUy6Nq1BgSWP8FwkefLtMa+EbnVwIhANVqtAXDD9cUmkthIgfdwJAmyetujjgW7t0E4PrJdV/B","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53686},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"0185984c0403718e0ed67c3132c0cfcd417a2083","scripts":{"test":"vitest run","build":"tsdown"},"_npmUser":{"name":"canmi","email":"t@canmi.icu"},"_npmVersion":"11.10.1","description":"Filesystem router for SeamJS. Scans `src/pages/` with Next.js/SvelteKit naming conventions and generates TanStack Router route definitions.","directories":{},"_nodeVersion":"25.7.0","dependencies":{"chokidar":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.9.3","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/seam-router_0.4.18_1772555176597_0.7285177135940952","host":"s3://npm-registry-packages-npm-production"}},"0.5.10":{"name":"@canmi/seam-router","version":"0.5.10","license":"MIT","_id":"@canmi/seam-router@0.5.10","maintainers":[{"name":"canmi","email":"t@canmi.icu"}],"bin":{"seam-router-generate":"dist/cli.js"},"dist":{"shasum":"951d13c5c8f59615e2069d6a0769e8b84c4c492f","tarball":"https://registry.npmjs.org/@canmi/seam-router/-/seam-router-0.5.10.tgz","fileCount":11,"integrity":"sha512-DJkwZVh+3wQY3EviKdz6j4CJGmZLP/fTofb0I3wzVTtoovqV5QKE763wvr7v/dM3pTjn8UTE5SeLtJJLxqiYjg==","signatures":[{"sig":"MEUCIGy+yZrPMPRqskrz8dmKbcRR4ZThZVmejS1WxuDwfApsAiEAvCB2+qS7Td/jQzZVBhUYOmpDux///Xrr7NUDFwqMrZI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53138},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"e7b80153466d2e30f3d48575a623c19c54a33d86","scripts":{"test":"vitest run","build":"tsdown"},"_npmUser":{"name":"canmi","email":"t@canmi.icu"},"_npmVersion":"11.10.1","description":"Filesystem router for SeamJS. Scans `src/pages/` with Next.js/SvelteKit naming conventions and generates TanStack Router route definitions.","directories":{},"_nodeVersion":"25.7.0","dependencies":{"chokidar":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.9.3","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/seam-router_0.5.10_1772723811934_0.648747699054359","host":"s3://npm-registry-packages-npm-production"}},"0.5.27":{"name":"@canmi/seam-router","version":"0.5.27","license":"MIT","_id":"@canmi/seam-router@0.5.27","maintainers":[{"name":"canmi","email":"t@canmi.icu"}],"bin":{"seam-router-generate":"dist/cli.js"},"dist":{"shasum":"d8eb72672198d44ae13d435e81ada5ac8003dce8","tarball":"https://registry.npmjs.org/@canmi/seam-router/-/seam-router-0.5.27.tgz","fileCount":11,"integrity":"sha512-EdKBqqO7svzMux1xYWunNEEFAcleekN8hfZp6tMGE52uSIrukMGv+C1i/vcaRnvwXhSeX6GmtBZ8QQGM2Z61pg==","signatures":[{"sig":"MEUCIC2Ku5eIqfE8tpt9ARMzW8Zry/swHqhRsL10nAd2eyi/AiEAqE7798sewJESmyqEytR5N/nWYPyn+ULggMs+FbLHt10=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53083},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"839277de0749659b65c5b609a4a6a6919dfd73b3","scripts":{"test":"vitest run","build":"tsdown"},"_npmUser":{"name":"canmi","email":"t@canmi.icu"},"_npmVersion":"11.10.1","description":"Filesystem router for SeamJS. Scans `src/pages/` with Next.js/SvelteKit naming conventions and generates TanStack Router route definitions.","directories":{},"_nodeVersion":"25.7.0","dependencies":{"chokidar":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.9.3","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/seam-router_0.5.27_1773023088171_0.5948759821969796","host":"s3://npm-registry-packages-npm-production"}},"0.5.31":{"name":"@canmi/seam-router","version":"0.5.31","license":"MIT","_id":"@canmi/seam-router@0.5.31","maintainers":[{"name":"canmi","email":"t@canmi.icu"}],"bin":{"seam-router-generate":"dist/cli.js"},"dist":{"shasum":"81d1689a8b7256f9f44f85e59df872101e56eddc","tarball":"https://registry.npmjs.org/@canmi/seam-router/-/seam-router-0.5.31.tgz","fileCount":11,"integrity":"sha512-Afp2jApGZ7MlCmxqZjTs9utPcRaqhc0c4GR7JAKS7jkTscxDUTBTfgTzrOdFoiBPuQNeBkwM1w3SjbOtp3Et4w==","signatures":[{"sig":"MEUCIFqFVUBp5Slci93aJ96U1u5e3zYpruH0omoiZ5tdBDIiAiEAlqf2M4rBZdM/LiM78Z5WzmEoE5aOnGgvpYsnZwQZ4oc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56948},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"ff754819c953803f0abd339f665b20a11c9db01f","scripts":{"test":"vitest run","build":"tsdown"},"_npmUser":{"name":"canmi","email":"t@canmi.icu"},"_npmVersion":"11.10.1","description":"Filesystem router for SeamJS. Scans `src/pages/` with Next.js/SvelteKit naming conventions and generates TanStack Router route definitions.","directories":{},"_nodeVersion":"25.7.0","dependencies":{"chokidar":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.9.3","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/seam-router_0.5.31_1773114509861_0.33197348454820874","host":"s3://npm-registry-packages-npm-production"}},"0.5.36":{"name":"@canmi/seam-router","version":"0.5.36","license":"MIT","_id":"@canmi/seam-router@0.5.36","maintainers":[{"name":"canmi","email":"t@canmi.icu"}],"bin":{"seam-router-generate":"dist/cli.js"},"dist":{"shasum":"296553cfc4121a20b94e5c1496e7fd44154e7973","tarball":"https://registry.npmjs.org/@canmi/seam-router/-/seam-router-0.5.36.tgz","fileCount":11,"integrity":"sha512-AeEXeNvWzcr9wt7KNeYpPgOamD0IMAQDw/LpxsUnOMFqWW8brRAFOrD5CubMQdsgX35axFli8thDgsMoABg5qQ==","signatures":[{"sig":"MEUCIQDn6r+2UQaIfaoXckJYw0E1Ex0M39RSqjIAIS3Pfp0JfQIgTW7DyJWUugjaUpervjinGnJpfKiq/STq2WJsVcB8Mco=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57309},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"443e119f48f399adf6abd49ad50749b9a3b6461c","scripts":{"test":"vitest run","build":"tsdown"},"_npmUser":{"name":"canmi","email":"t@canmi.icu"},"_npmVersion":"11.10.1","description":"Filesystem router for SeamJS. Scans `src/pages/` with Next.js/SvelteKit naming conventions and generates TanStack Router route definitions.","directories":{},"_nodeVersion":"25.7.0","dependencies":{"chokidar":"5"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"0.21","vitest":"4","typescript":"5","@types/node":"25"},"_npmOperationalInternal":{"tmp":"tmp/seam-router_0.5.36_1773336921353_0.46091761533160613","host":"s3://npm-registry-packages-npm-production"}},"0.5.38":{"name":"@canmi/seam-router","version":"0.5.38","license":"MIT","type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"bin":{"seam-router-generate":"dist/cli.js"},"scripts":{"build":"tsdown","test":"vitest run"},"dependencies":{"chokidar":"5"},"devDependencies":{"@types/node":"25","tsdown":"0.21","typescript":"6","vitest":"4"},"gitHead":"baed9724d9970829be89599297fcb11023a8aa05","_id":"@canmi/seam-router@0.5.38","description":"Filesystem router for SeamJS. Scans `src/pages/` with Next.js/SvelteKit naming conventions and generates TanStack Router route definitions.","_nodeVersion":"25.8.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-s8nI8EYrwgp52cY/uR8XWGshDnGRGzE3zp7eWogqDyEul+mALo5HqezNR4inBmVTBAkHw0uVhrbYMlpvK4PeVg==","shasum":"b54cc8bc3cd0d6d6cdf49fb172fffe0c59cf3f82","tarball":"https://registry.npmjs.org/@canmi/seam-router/-/seam-router-0.5.38.tgz","fileCount":11,"unpackedSize":57309,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDe/rexWd1m9THur0KzN7oS4MmdW9ZTJDXun9E6e1UTtgIhALimc+lmsbSgoEw3OeniYQ/yqxyKZX7t9Kq75gj/iwAx"}]},"_npmUser":{"name":"canmi","email":"t@canmi.icu"},"directories":{},"maintainers":[{"name":"canmi","email":"t@canmi.icu"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/seam-router_0.5.38_1774684421320_0.727238024388529"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-03T16:26:16.443Z","modified":"2026-03-28T07:53:41.585Z","0.4.18":"2026-03-03T16:26:16.714Z","0.5.10":"2026-03-05T15:16:52.128Z","0.5.27":"2026-03-09T02:24:48.316Z","0.5.31":"2026-03-10T03:48:30.002Z","0.5.36":"2026-03-12T17:35:21.502Z","0.5.38":"2026-03-28T07:53:41.474Z"},"license":"MIT","description":"Filesystem router for SeamJS. Scans `src/pages/` with Next.js/SvelteKit naming conventions and generates TanStack Router route definitions.","maintainers":[{"name":"canmi","email":"t@canmi.icu"}],"readme":"# @canmi/seam-router\n\nFilesystem router for SeamJS. Scans `src/pages/` with Next.js/SvelteKit naming conventions and generates TanStack Router route definitions.\n\n## Structure\n\n- `src/conventions.ts` — naming convention rules (`[param]`, `[[param]]`, `[...slug]`, `(group)`)\n- `src/scanner.ts` — recursive `src/pages/` directory scanner\n- `src/validator.ts` — duplicate paths, ambiguous dynamics, catch-all conflict detection\n- `src/generator.ts` — route tree to TypeScript code generation\n- `src/detect-exports.ts` — detect `loaders`/`mock` exports from page files\n- `src/watcher.ts` — `createWatcher` for dev-mode file watching via chokidar\n- `src/cli.ts` — `seam-router-generate` CLI entry point\n- `src/types.ts` — shared type definitions\n\n## Key Exports\n\n| Export           | Purpose                                          |\n| ---------------- | ------------------------------------------------ |\n| `scanPages`      | Scan `src/pages/` and build a route tree         |\n| `validateRoutes` | Check for duplicate/ambiguous/conflicting routes |\n| `generateRoutes` | Emit TypeScript route definitions                |\n| `createWatcher`  | Dev-mode file watcher for rebuild triggers       |\n\n## CLI\n\n```\nseam-router-generate <pagesDir> <outputPath>\n```\n\nThe Rust CLI shells out to this binary when `build.pages_dir` is set in `seam.toml`.\n\n## Supported Conventions\n\n| Pattern       | Example                | Meaning                          |\n| ------------- | ---------------------- | -------------------------------- |\n| `[param]`     | `[id]/page.tsx`        | Required dynamic segment         |\n| `[[param]]`   | `[[id]]/page.tsx`      | Optional dynamic segment         |\n| `[...slug]`   | `[...slug]/page.tsx`   | Catch-all (1+ segments)          |\n| `[[...slug]]` | `[[...slug]]/page.tsx` | Optional catch-all (0+ segments) |\n| `(group)`     | `(auth)/page.tsx`      | Route group (no URL segment)     |\n\n### Boundary Components\n\nThree special files define error/loading/not-found boundaries alongside `page.tsx` or `layout.tsx`:\n\n| File            | Example               | Generated property                       |\n| --------------- | --------------------- | ---------------------------------------- |\n| `error.tsx`     | `(auth)/error.tsx`    | Error boundary (`errorComponent`)        |\n| `loading.tsx`   | `(auth)/loading.tsx`  | Loading state (`pendingComponent`)       |\n| `not-found.tsx` | `users/not-found.tsx` | Not-found fallback (`notFoundComponent`) |\n\n- Place in any directory that contains `page.tsx` or `layout.tsx`\n- The nearest ancestor boundary applies to all child routes\n- A leaf-level file overrides its parent boundary\n\n### Layout Routes\n\n- `layout.tsx` wraps all child routes in the same directory\n- When `page.tsx` and `layout.tsx` coexist: page is split into a `path: \"/\"` child route under the layout\n- Group directories `(group)` with layout: generates pathless wrapper (`path: \"/\"`) — no URL impact\n- Non-group directories with layout: preserves the directory's path prefix\n- Layout `head` export propagates to all leaf child routes (merged via `mergeHeadConfigs`; leaf head takes precedence)\n\n## Development\n\n- Build: `just build-ts`\n- Test: `just test-ts`\n","readmeFilename":"README.md"}