{"_id":"@blyou/reurl","_rev":"2-3ec5557059a36f14469b73daba985839","name":"@blyou/reurl","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"@blyou/reurl","version":"0.0.1","keywords":["url","urlsearchparams"],"author":{"name":"blyou","email":"youbolincode@163.com"},"license":"MIT","_id":"@blyou/reurl@0.0.1","maintainers":[{"name":"blyou","email":"youbolincode@163.com"}],"homepage":"https://github.com/blyou/reurl#readme","bugs":{"url":"https://github.com/blyou/reurl/issues"},"dist":{"shasum":"f222092e1ce330dd1061e473a26581d995e765a7","tarball":"https://registry.npmjs.org/@blyou/reurl/-/reurl-0.0.1.tgz","fileCount":7,"integrity":"sha512-xrqg8NajUb+mqQV83ldm+iDaeT+L3TXNaFH5i8Q6MBMZLRtzN/8QkiCO57pvZO0SyqnartTQCFijQVqlmFCaog==","signatures":[{"sig":"MEUCIQDDc0ITzDvvaUzUYg/ApNycXWbLTDX+YcQNzftOZ0Rn8wIgI/PfdQxb1+QH+Kx//DgRLT2w62tJabRASM2YnlDpqyA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":16794},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"e331e04a7f161f7d5f29ca2cf4a1faa66d5ca3b0","scripts":{"dev":"tsdown --watch","lint":"run-s lint:*","taze":"pnpx taze -I","test":"vitest","build":"tsdown","format":"oxfmt src/","release":"bumpp","git:hooks":"pnpm simple-git-hooks","typecheck":"tsc --noEmit","lint:eslint":"eslint . --fix --cache","lint:oxlint":"oxlint . --fix","prepublishOnly":"pnpm run build"},"_npmUser":{"name":"blyou","email":"youbolincode@163.com"},"repository":{"url":"git+https://github.com/blyou/reurl.git","type":"git"},"_npmVersion":"11.13.0","description":"A tiny zero-dependency URL parser.","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.18.0+sha512.33d83c77da82f49fba836925c6f1b841181ec3132b670639bd012f7075f5c7cf634c5f870147c19aae7478fac01df09d8892e880454896edd23ee9b33757563c","devDependencies":{"bumpp":"^12.1.1","oxfmt":"^0.61.0","eslint":"^10.8.0","oxlint":"^1.76.0","terser":"^5.49.0","tsdown":"^0.22.14","vitest":"^4.1.10","typescript":"^6.0.3","@types/node":"^26.1.2","lint-staged":"^17.2.0","npm-run-all2":"^9.0.3","@commitlint/cli":"^21.2.1","simple-git-hooks":"^2.13.1","@commitlint/types":"^21.2.0","eslint-plugin-vue":"^10.10.0","eslint-plugin-oxlint":"^1.76.0","eslint-config-prettier":"^10.1.8","@typescript/native-preview":"7.0.0-dev.20260707.2","@vue/eslint-config-typescript":"^14.9.0","@commitlint/config-conventional":"^21.2.0"},"_npmOperationalInternal":{"tmp":"tmp/reurl_0.0.1_1785769668489_0.06973365388126496","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@blyou/reurl","version":"0.0.2","description":"A tiny zero-dependency URL parser.","keywords":["url","urlsearchparams"],"homepage":"https://github.com/blyou/reurl#readme","bugs":{"url":"https://github.com/blyou/reurl/issues"},"license":"MIT","author":{"name":"blyou","email":"youbolincode@163.com"},"repository":{"type":"git","url":"git+https://github.com/blyou/reurl.git"},"type":"module","sideEffects":false,"main":"./dist/index.cjs","module":"./dist/index.mjs","types":"./dist/index.d.cts","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"publishConfig":{"access":"public"},"scripts":{"build":"tsdown","dev":"tsdown --watch","test":"vitest","typecheck":"tsc --noEmit","release":"bumpp","prepublishOnly":"pnpm run build","lint":"run-s lint:*","lint:oxlint":"oxlint . --fix","lint:eslint":"eslint . --fix --cache","format":"oxfmt src/","git:hooks":"pnpm simple-git-hooks","taze":"pnpx taze -I"},"devDependencies":{"@commitlint/cli":"^21.2.1","@commitlint/config-conventional":"^21.2.0","@commitlint/types":"^21.2.0","@types/node":"^26.1.2","@typescript/native-preview":"7.0.0-dev.20260707.2","@vue/eslint-config-typescript":"^14.9.0","bumpp":"^12.1.1","eslint":"^10.8.0","eslint-config-prettier":"^10.1.8","eslint-plugin-oxlint":"^1.76.0","eslint-plugin-vue":"^10.10.0","lint-staged":"^17.2.0","npm-run-all2":"^9.0.3","oxfmt":"^0.61.0","oxlint":"^1.76.0","simple-git-hooks":"^2.13.1","terser":"^5.49.0","tsdown":"^0.22.14","typescript":"^6.0.3","vitest":"^4.1.10"},"packageManager":"pnpm@11.18.0+sha512.33d83c77da82f49fba836925c6f1b841181ec3132b670639bd012f7075f5c7cf634c5f870147c19aae7478fac01df09d8892e880454896edd23ee9b33757563c","gitHead":"d7e55cd7f564987b6725cfc21bdf7ee20f2b3efc","_id":"@blyou/reurl@0.0.2","_nodeVersion":"24.16.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-IEO/MiiuXhln6R8tQK/z6DrmVIfn+jampdc1vLBT4/2mO64dX8KQYo+y3Il7Ff9swKKpJVoUntbzqH0+BnRleg==","shasum":"7ca9ab7bfc7fcb1bd5d302c0c1de4712fc827057","tarball":"https://registry.npmjs.org/@blyou/reurl/-/reurl-0.0.2.tgz","fileCount":7,"unpackedSize":16989,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC1DrP0AR6iNIc5ItyukT2d/FvPnvsXRZiPq7Ww3W4spQIhAPpNp36RnSEH1aE0LpqA2ewpeZZQgt0tEGU6Hfs+g3WQ"}]},"_npmUser":{"name":"blyou","email":"youbolincode@163.com"},"directories":{},"maintainers":[{"name":"blyou","email":"youbolincode@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/reurl_0.0.2_1786096788507_0.731123546885815"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-03T15:07:48.291Z","modified":"2026-08-07T09:59:48.765Z","0.0.1":"2026-08-03T15:07:48.641Z","0.0.2":"2026-08-07T09:59:48.635Z"},"bugs":{"url":"https://github.com/blyou/reurl/issues"},"author":{"name":"blyou","email":"youbolincode@163.com"},"license":"MIT","homepage":"https://github.com/blyou/reurl#readme","keywords":["url","urlsearchparams"],"repository":{"type":"git","url":"git+https://github.com/blyou/reurl.git"},"description":"A tiny zero-dependency URL parser.","maintainers":[{"name":"blyou","email":"youbolincode@163.com"}],"readme":"# reurl\r\n\r\n超轻量的 URL 解析器：仅做必要的字符串切分与拼接，不做任何编码 / 解码 / 转义，不做规范化，不解析相对路径。与浏览器原生 `URL` / `URLSearchParams` 的 API 对齐，但运行时代码体积极小（构建产物约 1 KB gzip）。\r\n\r\n## 特性\r\n\r\n- 🪶 **极小体积**：仅做必要的字符串切分与拼接，零依赖\r\n- 🔤 **原样保留**：中文、空格、`%20` 等字符一律不处理，查询串不经 percent 编解码\r\n- 🌐 **支持 IPv6**：`[2001:db8::1]:8080` 这类主机正确拆分 host / hostname / port\r\n- 🧩 **TypeScript 类型对齐**：导出 `ReURL` 与 `ReSearchParams`，签名对齐原生接口\r\n\r\n## 安装\r\n\r\n```bash\r\npnpm i @blyou/reurl\r\n```\r\n\r\n## 使用\r\n\r\n### ReURL\r\n\r\n```ts\r\nimport { ReURL } from '@blyou/reurl'\r\n\r\nconst u = new ReURL('https://example.com:8080/a/b?x=1&y=2#frag')\r\n\r\nu.protocol // 'https:'\r\nu.host // 'example.com:8080'\r\nu.hostname // 'example.com'\r\nu.port // '8080'\r\nu.pathname // '/a/b'\r\nu.search // '?x=1&y=2'\r\nu.hash // '#frag'\r\nu.origin // 'https://example.com:8080'\r\nu.href // 'https://example.com:8080/a/b?x=1&y=2#frag'\r\n```\r\n\r\n所有 getter 都有对应的 setter，修改任一字段都会即时反映到 `href`：\r\n\r\n```ts\r\nu.hostname = 'b.com' // host → 'b.com:8080'\r\nu.port = '9090' // host → 'b.com:9090'\r\nu.pathname = '/new' // href 同步更新\r\n```\r\n\r\n#### userinfo（username / password）\r\n\r\n```ts\r\nconst u2 = new ReURL('https://user:pass@a.com/')\r\n\r\nu2.username // 'user'\r\nu2.password // 'pass'\r\nu2.password = 'new' // href → 'https://user:new@a.com/'\r\nu2.username = ''\r\nu2.password = '' // href → 'https://a.com/'（userinfo 整体移除）\r\n```\r\n\r\n#### searchParams 双向联动\r\n\r\n```ts\r\nconst u = new ReURL('https://a.com/p?a=1&b=2')\r\nconst sp = u.searchParams // 同一对象会被缓存\r\n\r\nsp.append('c', '3')\r\nu.href // 'https://a.com/p?a=1&b=2&c=3'\r\n\r\nu.search = 'k=v'\r\nsp.get('k') // 'v'\r\n```\r\n\r\n### ReSearchParams\r\n\r\n查询串仅按 `&` / `=` 切分与拼接，不做编解码。\r\n\r\n```ts\r\nimport { ReSearchParams } from '@blyou/reurl'\r\n\r\nconst sp = new ReSearchParams('?a=1&a=2&b=2')\r\n\r\nsp.get('a') // '1'\r\nsp.getAll('a') // ['1', '2']\r\nsp.has('b') // true\r\nsp.append('c', '3')\r\nsp.set('b', '9') // 先删后插，不保留键的原始位置\r\nsp.delete('a')\r\nsp.sort() // 按键稳定排序\r\nsp.toString() // 'b=9&c=3'\r\n\r\n// 迭代器\r\nfor (const [key, value] of sp) {\r\n  /* ... */\r\n}\r\nsp.keys()\r\nsp.values()\r\nsp.entries()\r\n```\r\n\r\n支持字符串 / 二维数组 / 对象 / `ReSearchParams` 多种构造方式：\r\n\r\n```ts\r\nnew ReSearchParams([\r\n  ['a', '1'],\r\n  ['b', '2'],\r\n])\r\nnew ReSearchParams({ a: '1', b: '2' })\r\nnew ReSearchParams(new ReSearchParams('a=1'))\r\n```\r\n\r\n## 与原生 API 的有意差异\r\n\r\n为了在最小体积下工作，`reurl` 刻意省略了一些原生行为：\r\n\r\n| 项目                 | 原生行为                     | reurl 行为                                     |\r\n| -------------------- | ---------------------------- | ---------------------------------------------- |\r\n| 非分层协议           | `data:` / `mailto:` 等可解析 | **不支持**，直接抛出 `TypeError`               |\r\n| 相对路径             | `new URL('/p', base)` 可解析 | **不支持** `base` 参数（相对路径视为不可解析） |\r\n| `searchParams.set()` | 保留键的原始位置             | 先删后插，位置移到末尾                         |\r\n| userinfo             | 拆分且 percent 编解码        | 拆分 username / password，但原样保留不编解码   |\r\n\r\n## 开发\r\n\r\n```bash\r\npnpm install     # 安装依赖\r\npnpm test        # 运行单元测试\r\npnpm typecheck   # 类型检查\r\npnpm lint        # 代码检查\r\npnpm build       # 构建产物到 dist/\r\n```\r\n\r\n## License\r\n\r\n[MIT](./LICENSE)\r\n","readmeFilename":"README.md"}