{"_id":"@aegisjsproject/atlas","_rev":"5-acf0d42520026c7103a801ee30956cd8","name":"@aegisjsproject/atlas","dist-tags":{"latest":"1.1.0"},"versions":{"0.0.0":{"name":"@aegisjsproject/atlas","version":"0.0.0","keywords":[],"author":{"name":"Chris Zuber","email":"admin@kernvalley.us"},"license":"MIT","_id":"@aegisjsproject/atlas@0.0.0","maintainers":[{"name":"shgysk8zer0","email":"shgysk8zer0@gmail.com"}],"homepage":"https://github.com/AegisJSProject/atlas#readme","bugs":{"url":"https://github.com/AegisJSProject/atlas/issues"},"dist":{"shasum":"b3b87b202c691339b4d8a68f1860cdb3fdbab0ac","tarball":"https://registry.npmjs.org/@aegisjsproject/atlas/-/atlas-0.0.0.tgz","fileCount":11,"integrity":"sha512-txbO3glGfRUWWl3HqimtcTUV0o8iAsygMLWlYmBl2+oJqJ0G0V+LM7xhOp7IbmgZvo87Kg0SHpRaAyhfdsnGQw==","signatures":[{"sig":"MEUCIQDub5j82kPd5RLoUyrBm6TRu0VFpVmcQO6ZKqxMr9jRlgIgXZdmzn5TbqVZdGju/fx8u9PRlso0/7JN3yTwSkdwWlw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96401},"main":"./atlas.cjs","type":"module","unpkg":"./atlas.min.js","module":"./atlas.js","engines":{"node":">=24.10.0"},"exports":{".":{"import":"./atlas.js","require":"./atlas.cjs"},"./*":{"import":"./*.js","require":"./*.cjs"},"./*.js":{"import":"./*.js","require":"./*.cjs"},"./*.cjs":{"import":"./*.js","require":"./*.cjs"},"./*.mjs":{"import":"./*.js","require":"./*.cjs"}},"funding":[{"url":"https://liberapay.com/shgysk8zer0","type":"librepay"},{"url":"https://github.com/sponsors/shgysk8zer0","type":"github"}],"gitHead":"55ec532cfb0c2bdd5432a9b388d8ff1ca5a9658e","private":false,"scripts":{"test":"npm run lint:js && npm run run:tests","build":"npm run build:js","clean":"rm -f ./*.cjs","start":"http-server -c ./http.config.js","fix:js":"eslint . --fix","lint:js":"eslint .","prepare":"npm test && npm run build --if-present","build:js":"npm run clean && rollup -c rollup.config.js","run:tests":"node --test","preversion":"npm test && npm run build --if-present","create:lock":"npm i --package-lock-only --ignore-scripts --no-audit --no-fund","version:bump":"npm run version:bump:patch","version:bump:major":"npm version --no-git-tag-version major && npm run create:lock","version:bump:minor":"npm version --no-git-tag-version minor && npm run create:lock","version:bump:patch":"npm version --no-git-tag-version patch && npm run create:lock"},"_npmUser":{"name":"shgysk8zer0","email":"shgysk8zer0@gmail.com"},"repository":{"url":"git+https://github.com/AegisJSProject/atlas.git","type":"git"},"_npmVersion":"11.6.1","description":"A template repo for npm packages","directories":{},"_nodeVersion":"24.10.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.2.1","rollup":"^4.60.2","@rollup/plugin-terser":"^1.0.0","@shgysk8zer0/importmap":"^1.9.10","@shgysk8zer0/http-server":"^1.1.2","@aegisjsproject/dev-server":"^1.0.6","@aegisjsproject/http-utils":"^1.0.4","@shgysk8zer0/eslint-config":"^1.0.9"},"_npmOperationalInternal":{"tmp":"tmp/atlas_0.0.0_1777493593797_0.3537030753430186","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@aegisjsproject/atlas","version":"1.0.0","keywords":["router","navigation-api","client-side-routing","spa","spa-router","import-maps","dynamic-import","module-router","lightweight","urlpattern","progressive-enhancement","modern-web","esm"],"author":{"name":"Chris Zuber","email":"admin@kernvalley.us"},"license":"MIT","_id":"@aegisjsproject/atlas@1.0.0","maintainers":[{"name":"shgysk8zer0","email":"shgysk8zer0@gmail.com"}],"homepage":"https://github.com/AegisJSProject/atlas#readme","bugs":{"url":"https://github.com/AegisJSProject/atlas/issues"},"dist":{"shasum":"713f380114a5aaa6612146169e32def530a6ebac","tarball":"https://registry.npmjs.org/@aegisjsproject/atlas/-/atlas-1.0.0.tgz","fileCount":11,"integrity":"sha512-X43ot2k1aFWcxb+Gqow+v8dqLCAsPvoRN0FTQC7BEVAHw9t48z9329cCgaKYrypAVBpjDV2+4+OfkZ8zulwD6w==","signatures":[{"sig":"MEUCIQD+vnya1MzEka3x5RwWnzvZ6L70xFxsGJHgwPQqzb5S/AIgZE8aBuwWPqfdLf3DgC0724U0jKtTw3+mGpmijuQvJ9U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aegisjsproject%2fatlas@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":96684},"main":"./atlas.cjs","type":"module","unpkg":"./atlas.min.js","module":"./atlas.js","engines":{"node":">=24.10.0"},"exports":{".":{"import":"./atlas.js","require":"./atlas.cjs"},"./*":{"import":"./*.js","require":"./*.cjs"},"./*.js":{"import":"./*.js","require":"./*.cjs"},"./*.cjs":{"import":"./*.js","require":"./*.cjs"},"./*.mjs":{"import":"./*.js","require":"./*.cjs"}},"funding":[{"url":"https://liberapay.com/shgysk8zer0","type":"librepay"},{"url":"https://github.com/sponsors/shgysk8zer0","type":"github"}],"gitHead":"74ac0ac9c8bb19cbdecd50aed31aebbd5aa4abed","private":false,"scripts":{"test":"npm run lint:js && npm run run:tests","build":"npm run build:js","clean":"rm -f ./*.cjs","start":"http-server -c ./http.config.js","fix:js":"eslint . --fix","lint:js":"eslint .","prepare":"npm test && npm run build --if-present","build:js":"npm run clean && rollup -c rollup.config.js","run:tests":"node --test","preversion":"npm test && npm run build --if-present","create:lock":"npm i --package-lock-only --ignore-scripts --no-audit --no-fund","version:bump":"npm run version:bump:patch","version:bump:major":"npm version --no-git-tag-version major && npm run create:lock","version:bump:minor":"npm version --no-git-tag-version minor && npm run create:lock","version:bump:patch":"npm version --no-git-tag-version patch && npm run create:lock"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dd950677-b30a-4857-8d02-fcd1a9897cf7"}},"repository":{"url":"git+https://github.com/AegisJSProject/atlas.git","type":"git"},"_npmVersion":"11.6.1","description":"A client-side router library using `Navigation` & `URLPattern`","directories":{},"_nodeVersion":"24.10.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.2.1","rollup":"^4.60.2","@rollup/plugin-terser":"^1.0.0","@shgysk8zer0/importmap":"^1.9.10","@shgysk8zer0/http-server":"^1.1.2","@aegisjsproject/dev-server":"^1.0.6","@aegisjsproject/http-utils":"^1.0.4","@shgysk8zer0/eslint-config":"^1.0.9"},"_npmOperationalInternal":{"tmp":"tmp/atlas_1.0.0_1777494327718_0.7442010837752042","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@aegisjsproject/atlas","version":"1.0.1","keywords":["router","navigation-api","client-side-routing","spa","spa-router","import-maps","dynamic-import","module-router","lightweight","urlpattern","progressive-enhancement","modern-web","esm"],"author":{"name":"Chris Zuber","email":"admin@kernvalley.us"},"license":"MIT","_id":"@aegisjsproject/atlas@1.0.1","maintainers":[{"name":"shgysk8zer0","email":"shgysk8zer0@gmail.com"}],"homepage":"https://github.com/AegisJSProject/atlas#readme","bugs":{"url":"https://github.com/AegisJSProject/atlas/issues"},"dist":{"shasum":"7c1aa0f1452ce9ed435dfcca5fc356d7539c395f","tarball":"https://registry.npmjs.org/@aegisjsproject/atlas/-/atlas-1.0.1.tgz","fileCount":11,"integrity":"sha512-TjKErVjD4kz7DAhL7+JJTcVC/K7fsw8KZ4t2Xm/ZfR9ALliT2DxsoqXY/Mv6qXuK+DfPWMJRjNgyJMc6c4chMQ==","signatures":[{"sig":"MEUCIQDuMUB4mFy/23pwnZzSYgR5+TMWEdwRthV0q+8nWtc5ggIgWAp6qrTJrg1HVVKHTRIpkZqUzN4+GBnclorm09iQCOM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aegisjsproject%2fatlas@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":98674},"main":"./atlas.cjs","type":"module","unpkg":"./atlas.min.js","module":"./atlas.js","engines":{"node":">=24.10.0"},"exports":{".":{"import":"./atlas.js","require":"./atlas.cjs"},"./*":{"import":"./*.js","require":"./*.cjs"},"./*.js":{"import":"./*.js","require":"./*.cjs"},"./*.cjs":{"import":"./*.js","require":"./*.cjs"},"./*.mjs":{"import":"./*.js","require":"./*.cjs"}},"funding":[{"url":"https://liberapay.com/shgysk8zer0","type":"librepay"},{"url":"https://github.com/sponsors/shgysk8zer0","type":"github"}],"gitHead":"c5ad7e7e42a6f803f368d065e10b76213d8c7c2c","private":false,"scripts":{"test":"npm run lint:js && npm run run:tests","build":"npm run build:js","clean":"rm -f ./*.cjs","start":"http-server -c ./http.config.js","fix:js":"eslint . --fix","lint:js":"eslint .","prepare":"npm test && npm run build --if-present","build:js":"npm run clean && rollup -c rollup.config.js","run:tests":"node --test","preversion":"npm test && npm run build --if-present","create:lock":"npm i --package-lock-only --ignore-scripts --no-audit --no-fund","version:bump":"npm run version:bump:patch","version:bump:major":"npm version --no-git-tag-version major && npm run create:lock","version:bump:minor":"npm version --no-git-tag-version minor && npm run create:lock","version:bump:patch":"npm version --no-git-tag-version patch && npm run create:lock"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dd950677-b30a-4857-8d02-fcd1a9897cf7"}},"repository":{"url":"git+https://github.com/AegisJSProject/atlas.git","type":"git"},"_npmVersion":"11.6.1","description":"A client-side router library using `Navigation` & `URLPattern`","directories":{},"_nodeVersion":"24.10.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.2.1","rollup":"^4.60.2","@rollup/plugin-terser":"^1.0.0","@shgysk8zer0/importmap":"^1.9.10","@shgysk8zer0/http-server":"^1.1.2","@aegisjsproject/dev-server":"^1.0.6","@aegisjsproject/http-utils":"^1.0.4","@shgysk8zer0/eslint-config":"^1.0.9"},"_npmOperationalInternal":{"tmp":"tmp/atlas_1.0.1_1777499612809_0.5402476141594053","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@aegisjsproject/atlas","version":"1.0.2","keywords":["router","navigation-api","client-side-routing","spa","spa-router","import-maps","dynamic-import","module-router","lightweight","urlpattern","progressive-enhancement","modern-web","esm"],"author":{"name":"Chris Zuber","email":"admin@kernvalley.us"},"license":"MIT","_id":"@aegisjsproject/atlas@1.0.2","maintainers":[{"name":"shgysk8zer0","email":"shgysk8zer0@gmail.com"}],"homepage":"https://github.com/AegisJSProject/atlas#readme","bugs":{"url":"https://github.com/AegisJSProject/atlas/issues"},"dist":{"shasum":"7b9e4e6e09b5b7f0340e2dd932479873095e2eba","tarball":"https://registry.npmjs.org/@aegisjsproject/atlas/-/atlas-1.0.2.tgz","fileCount":11,"integrity":"sha512-UgS3eZ7MkTS62SgGEe3CJpBLnXhL74k0uW8HqRCTj3IFkCyhJv2QrVuyIUG+r+EnFht7vunQf4LyS2FXrcW+/Q==","signatures":[{"sig":"MEUCIBqTUqKjXhsK/ORy/wQBIp5Z6cSxkFOPS0JqOo/cW53vAiEAsFgOy+7sSjlO2d9UIDE89w49MtqGTL0/uonNJnHgMwM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aegisjsproject%2fatlas@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":106691},"main":"./atlas.cjs","type":"module","unpkg":"./atlas.min.js","module":"./atlas.js","engines":{"node":">=24.10.0"},"exports":{".":{"import":"./atlas.js","require":"./atlas.cjs"},"./*":{"import":"./*.js","require":"./*.cjs"},"./*.js":{"import":"./*.js","require":"./*.cjs"},"./*.cjs":{"import":"./*.js","require":"./*.cjs"},"./*.mjs":{"import":"./*.js","require":"./*.cjs"}},"funding":[{"url":"https://liberapay.com/shgysk8zer0","type":"librepay"},{"url":"https://github.com/sponsors/shgysk8zer0","type":"github"}],"gitHead":"163923c4061b8472ef9e8214da088a62925eed7f","private":false,"scripts":{"test":"npm run lint:js && npm run run:tests","build":"npm run build:js","clean":"rm -f ./*.cjs","start":"http-server -c ./http.config.js","fix:js":"eslint . --fix","lint:js":"eslint .","prepare":"npm test && npm run build --if-present","build:js":"npm run clean && rollup -c rollup.config.js","run:tests":"node --test","preversion":"npm test && npm run build --if-present","create:lock":"npm i --package-lock-only --ignore-scripts --no-audit --no-fund","version:bump":"npm run version:bump:patch","version:bump:major":"npm version --no-git-tag-version major && npm run create:lock","version:bump:minor":"npm version --no-git-tag-version minor && npm run create:lock","version:bump:patch":"npm version --no-git-tag-version patch && npm run create:lock"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dd950677-b30a-4857-8d02-fcd1a9897cf7"}},"repository":{"url":"git+https://github.com/AegisJSProject/atlas.git","type":"git"},"_npmVersion":"11.6.1","description":"A client-side router library using `Navigation` & `URLPattern`","directories":{},"_nodeVersion":"24.10.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.2.1","rollup":"^4.60.2","@rollup/plugin-terser":"^1.0.0","@shgysk8zer0/importmap":"^1.9.10","@shgysk8zer0/http-server":"^1.1.2","@aegisjsproject/dev-server":"^1.0.6","@aegisjsproject/http-utils":"^1.0.4","@shgysk8zer0/eslint-config":"^1.0.9"},"_npmOperationalInternal":{"tmp":"tmp/atlas_1.0.2_1777588793302_0.053899309566534104","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"_id":"@aegisjsproject/atlas@1.1.0","bugs":{"url":"https://github.com/AegisJSProject/atlas/issues"},"dist":{"shasum":"a6cd24be0be08006ef6dfe26e5a9625d58d87f09","tarball":"https://registry.npmjs.org/@aegisjsproject/atlas/-/atlas-1.1.0.tgz","integrity":"sha512-1OA09NGujRVJXpR9Q9nkAQylUyiVw6TjfCJVhwg4YAcbbG1Mox24ATLNu+FRhEXbLKiWxHBr3clMT10tFvLouw==","fileCount":12,"unpackedSize":107592,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aegisjsproject%2fatlas@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDEz30RFJ+hEsQCrwTkRWtq1KidAn/ll4Y97Rm+NimrngIgXDSKZESIyRZ/zgVVlG0LTyRugDONa4Yt9WJbNxGu3Ds="}]},"main":"./atlas.cjs","name":"@aegisjsproject/atlas","type":"module","unpkg":"./atlas.min.js","author":{"name":"Chris Zuber","email":"admin@kernvalley.us"},"module":"./atlas.js","engines":{"node":">=24.10.0"},"exports":{".":{"import":"./atlas.js","require":"./atlas.cjs"},"./*":{"import":"./*.js","require":"./*.cjs"},"./*.js":{"import":"./*.js","require":"./*.cjs"},"./*.cjs":{"import":"./*.js","require":"./*.cjs"},"./*.mjs":{"import":"./*.js","require":"./*.cjs"}},"funding":[{"url":"https://liberapay.com/shgysk8zer0","type":"librepay"},{"url":"https://github.com/sponsors/shgysk8zer0","type":"github"}],"gitHead":"34493f5105d90395ef37fe21153ce3dbd6d662b2","license":"MIT","private":false,"scripts":{"test":"npm run lint:js && npm run run:tests","build":"npm run build:js","clean":"rm -f ./*.cjs","start":"http-server -c ./http.config.js","fix:js":"eslint . --fix","lint:js":"eslint .","prepare":"npm test && npm run build --if-present","build:js":"npm run clean && rollup -c rollup.config.js","run:tests":"node --test","preversion":"npm test && npm run build --if-present","create:lock":"npm i --package-lock-only --ignore-scripts --no-audit --no-fund","version:bump":"npm run version:bump:patch","version:bump:major":"npm version --no-git-tag-version major && npm run create:lock","version:bump:minor":"npm version --no-git-tag-version minor && npm run create:lock","version:bump:patch":"npm version --no-git-tag-version patch && npm run create:lock"},"version":"1.1.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:af4fb28d-598b-4e80-ab74-4fe7b7063ec9"},"approver":{"name":"shgysk8zer0","email":"shgysk8zer0@gmail.com"}},"homepage":"https://github.com/AegisJSProject/atlas#readme","keywords":["router","navigation-api","client-side-routing","spa","spa-router","import-maps","dynamic-import","module-router","lightweight","urlpattern","progressive-enhancement","modern-web","esm"],"repository":{"url":"git+https://github.com/AegisJSProject/atlas.git","type":"git"},"_npmVersion":"11.16.0","description":"A client-side router library using `Navigation` & `URLPattern`","directories":{},"maintainers":[{"name":"shgysk8zer0","email":"shgysk8zer0@gmail.com"}],"_nodeVersion":"26.3.0","allowScripts":{"fsevents@2.3.3":true},"devDependencies":{"eslint":"^10.5.0","rollup":"^4.62.2","@rollup/plugin-terser":"^1.0.0","@shgysk8zer0/importmap":"^1.10.2","@shgysk8zer0/http-server":"^1.2.0","@aegisjsproject/dev-server":"^1.1.0","@aegisjsproject/http-utils":"^1.1.0","@shgysk8zer0/eslint-config":"^1.1.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/atlas_1.1.0_1782327927243_0.25408471381707964"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-29T20:13:13.723Z","modified":"2026-06-24T19:05:27.672Z","0.0.0":"2026-04-29T20:13:13.930Z","1.0.0":"2026-04-29T20:25:27.857Z","1.0.1":"2026-04-29T21:53:32.953Z","1.0.2":"2026-04-30T22:39:53.452Z","1.1.0":"2026-06-24T19:05:27.338Z"},"bugs":{"url":"https://github.com/AegisJSProject/atlas/issues"},"author":{"name":"Chris Zuber","email":"admin@kernvalley.us"},"license":"MIT","homepage":"https://github.com/AegisJSProject/atlas#readme","keywords":["router","navigation-api","client-side-routing","spa","spa-router","import-maps","dynamic-import","module-router","lightweight","urlpattern","progressive-enhancement","modern-web","esm"],"repository":{"url":"git+https://github.com/AegisJSProject/atlas.git","type":"git"},"description":"A client-side router library using `Navigation` & `URLPattern`","maintainers":[{"name":"shgysk8zer0","email":"shgysk8zer0@gmail.com"}],"readme":"# `@aegisjsproject/atlas`\n\nA client-side router library using `Navigation` & `URLPattern`\n\n[![CodeQL](https://github.com/AegisJSProject/atlas/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/AegisJSProject/atlas/actions/workflows/codeql-analysis.yml)\n![Node CI](https://github.com/AegisJSProject/atlas/workflows/Node%20CI/badge.svg)\n![Lint Code Base](https://github.com/AegisJSProject/atlas/workflows/Lint%20Code%20Base/badge.svg)\n\n[![GitHub license](https://img.shields.io/github/license/AegisJSProject/atlas.svg)](https://github.com/AegisJSProject/atlas/blob/master/LICENSE)\n[![GitHub last commit](https://img.shields.io/github/last-commit/AegisJSProject/atlas.svg)](https://github.com/AegisJSProject/atlas/commits/master)\n[![GitHub release](https://img.shields.io/github/release/AegisJSProject/atlas?logo=github)](https://github.com/AegisJSProject/atlas/releases)\n[![GitHub Sponsors](https://img.shields.io/github/sponsors/shgysk8zer0?logo=github)](https://github.com/sponsors/shgysk8zer0)\n\n[![npm](https://img.shields.io/npm/v/@aegisjsproject/atlas)](https://www.npmjs.com/package/@aegisjsproject/atlas)\n![node-current](https://img.shields.io/node/v/@aegisjsproject/atlas)\n![npm bundle size gzipped](https://img.shields.io/bundlephobia/minzip/@aegisjsproject/atlas)\n[![npm](https://img.shields.io/npm/dw/@aegisjsproject/atlas?logo=npm)](https://www.npmjs.com/package/@aegisjsproject/atlas)\n\n[![GitHub followers](https://img.shields.io/github/followers/AegisJSProject.svg?style=social)](https://github.com/shgysk8zer0)\n![GitHub forks](https://img.shields.io/github/forks/AegisJSProject/atlas.svg?style=social)\n![GitHub stars](https://img.shields.io/github/stars/AegisJSProject/atlas.svg?style=social)\n[![Twitter Follow](https://img.shields.io/twitter/follow/shgysk8zer0.svg?style=social)](https://twitter.com/shgysk8zer0)\n\n[![Donate using Liberapay](https://img.shields.io/liberapay/receives/shgysk8zer0.svg?logo=liberapay)](https://liberapay.com/shgysk8zer0/donate \"Donate using Liberapay\")\n- - -\n\n- [Code of Conduct](./.github/CODE_OF_CONDUCT.md)\n- [Contributing](./.github/CONTRIBUTING.md)\n- [Security Policy](./.github/SECURITY.md)\n\n## Overview\n\nThis router intercepts same-origin navigations and resolves them to registered route modules. Each module can return content in multiple native formats (e.g. `Response`, `Document`, `Element`), allowing flexibility without imposing rendering constraints.\n\n> [!IMPORTANT]\n> This requires the [Navigation API](https://developer.mozilla.org/en-US/docs/Web/API/Navigation_API), which is Baseline 2026.\n> It also creates a [Trusted Types Policy](https://developer.mozilla.org/en-US/docs/Web/API/Trusted_Types_API), where supported,\n> labeled `\"aegis-atlas#html\"` for handling HTML responses without sanitizer restrictions.\n\nKey characteristics:\n\n- Native Navigation API (`navigation`)\n- Route-to-module mapping via dynamic `import()`\n- Direct DOM updates (no diffing layer)\n- Supports HTML streaming via `Response`\n- Built-in metadata handling (title, description, styles)\n- Optional preload observation\n- Abort-safe lifecycle with `AbortController` and `DisposableStack`\n\n> [!TIP]\n> Route module specifiers can use bare specifiers like `@acme/blog`. These can be resolved via an import map, for example:\n>\n> ```html\n> <script type=\"importmap\">\n> {\n>   \"imports\": {\n>     \"@acme/blog\": \"https://cdn.example.com/acme-blog/index.js\"\n>   }\n> }\n> </script>\n> ```\n>\n> This allows modules to be loaded from a CDN without changing route definitions.\n- - -\n\n## Installation\n\nThis module is intended to be used directly in modern browser environments.\n\n```js\nimport { init } from '@aegisjsproject/atlas';\n```\n\nNo dependencies required.\n\n- - -\n\n## Core Concepts\n\n### Route Modules\n\nEach route resolves to a module with the following shape:\n\n```js\n\nexport default async function handler(request, context) {\n  return new Response('<h1>Hello</h1>', {\n    headers: { 'Content-Type': 'text/html' }\n  });\n}\n\nexport const title = 'Page Title';\n\nexport const description = 'Page description';\n\nexport const styles = new CSSStyleSheet();\n```\n\n#### Supported Exports\n\n- `default` (required)\n  - Function: `(Request, RouteContextObject) => HandlerResult`\n  - Or static value: `HandlerResult`\n- `title` (optional)\n- `description` (optional)\n- `styles` (optional: `CSSStyleSheet` or array)\n\n- - -\n\n### Handler Return Types\n\nHandlers may return:\n- `Response` (must be `text/html`)\n- `HTMLDocument`\n- `Element`\n- `DocumentFragment`\n- `URL` (triggers navigation)\n- - -\n\n### Route Context\n\nEach handler receives a `context` object:\n\n```js\n{\n\n  result,        // URLPatternResult\n  params,        // extracted route params\n  stack,         // DisposableStack\n  controller,    // AbortController\n  signal,        // AbortSignal\n  type,          // navigation type\n  url,           // URL instance\n  state,         // navigation state\n  info,          // navigation info\n  timestamp      // performance timestamp\n}\n\n```\n\n- - -\n\n## Usage\n\n### Initialize Router\n\n```js\n\ninit({\n  '/': '/routes/home.js',\n  '/users/:id': '/routes/user.js'\n  '/posts/:year(\\\\d{4})/:month(\\\\d{2})/:day(\\\\d{2})/:slug': '@acme/blog',\n  '/product/:sku': '@acme/store/product',\n}, {\n  root: 'app',\n  preload: true\n});\n\n```\n\n#### Options\n\n- `root`: Element or element ID where content is rendered\n- `preload`: Enable preload observation\n- `signal`: Optional `AbortSignal` for teardown\n\n- - -\n\n### Navigation Helpers\n\n```js\n\nimport { navigate, back, forward, reload } from './router.js';\n\nnavigate('/about');\nback();\nforward();\nreload();\n```\n\n- - -\n\n### Navigation Lifecycle\n\nWait for navigation completion:\n\n```js\nimport { whenLoaded } from './router.js';\n\nawait whenLoaded();\n```\n\n- - -\n\n## Behavior Details\n\n### Interception Rules\n\nNavigation is intercepted only if:\n\n- `event.canIntercept` is true\n- URL is same-origin\n- Triggering element does **not** have `.no-router`\n\n- - -\n\n### Content Handling\n\n#### `Response`\n\n- Must be `text/html`\n- Parsed via `Document.parseHTMLUnsafe`\n- Re-processed as `HTMLDocument`\n\n#### `HTMLDocument`\n\n- Updates:\n  - `document.title`\n  - meta description\n  - root content\n\n#### `Element` / `DocumentFragment`\n\n- Directly replaces root children\n\n#### `URL`\n\n- Triggers navigation\n\n- - -\n\n### Root Management\n\n```js\n\nsetRoot('app');\n\n// or\n\nsetRoot(document.getElementById('app'));\n\n```\n\nIf root is `<body>`, full body is replaced.  \n\nIf root is an element with `id`, only matching subtree is replaced.\n\n- - -\n\n### Metadata Updates\n\nRoute modules can define:\n\n- `title` → updates `document.title`\n- `description` → updates all matching meta tags:\n  - `name=\"description\"`\n  - `og:description`\n  - `twitter:description`\n- `styles` → appended to `document.adoptedStyleSheets`\n\n- - -\n\n### Form Handling\n\n- Automatically determines method (`GET` or `POST`)\n- Submits `FormData` when applicable\n- Uses `Request` API for consistency\n\n- - -\n\n### Abort + Cleanup\n\nEach navigation:\n\n- Uses `AbortController`\n- Combines signals via `AbortSignal.any`\n- Cleans up via `DisposableStack`\n\nHandlers should respect `context.signal` where applicable.\n\n- - -\n\n### Trusted Types\n\nIf supported, a Trusted Types policy is used to safely pass HTML into:\n\n```js\n\nDocument.parseHTMLUnsafe(...)\n\n```\n\nThis ensures CSP compatibility without stripping critical markup like:\n\n- `<iframe>`\n- inline event handlers\n- form attributes\n\n- - -\n\n## Example Route\n\n```js\n\nexport default async function(request, { params }) {\n  return new Response(`\n    <h1>User ${params.id}</h1>\n  `, {\n    headers: { 'Content-Type': 'text/html' }\n  });\n}\n\nexport const title = 'User Profile';\nexport const description = 'User details page';\n\n```\n\n- - -\n\n## Notes\n\n- Only `text/html` responses are supported for `Response`\n- Non-matching routes fall back to `fetch()`\n- Errors during routing are surfaced via `reportError`\n- Designed for modern browsers with Navigation API support\n\n- - -\n\n## Summary\n\nThis router provides a low-level, high-control alternative to framework routers by:\n\n- Eliminating abstraction layers\n- Leveraging native platform APIs\n- Supporting flexible content types\n- Maintaining strict control over navigation lifecycle\n\nIntended for environments where performance, control, and minimal overhead are priorities.\n","readmeFilename":"README.md"}