{"_id":"@1-/psl","_rev":"5-daaaaab06035da82947d0b95fcbcebf0","name":"@1-/psl","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"@1-/psl","version":"0.1.0","keywords":["psl","public-suffix","domain","tld","cookie"],"author":{"name":"x-at-01@googlegroups.com"},"license":"MulanPSL-2.0","_id":"@1-/psl@0.1.0","maintainers":[{"name":"i18n-now","email":"i18n.site@gmail.com"}],"homepage":"https://github.com/webc-site/npm/tree/main/psl","bugs":{"url":"https://github.com/webc-site/npm/issues"},"dist":{"shasum":"2d28a568d3267b279c0c25a5ac171f1f3496ff50","tarball":"https://registry.npmjs.org/@1-/psl/-/psl-0.1.0.tgz","fileCount":4,"integrity":"sha512-0YC3Q+XXIOQ2mP/80mSyvKpSF0Rla0OWdmzCjTm2sXOCJ6TdocyEdvW31EhAVA/GQJvz3Ajy2wC18M8rHmK/ow==","signatures":[{"sig":"MEYCIQCo46Bz+UmkAziKx7Ri6O3vNHGrKtpjwJB4iHrvdYi1ygIhAKeGYnugQmMBshmKtEQczUt9Yt5ELWqbqKAxTI56BOca","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121445},"type":"module","exports":{".":"./_.js","./*":"./*"},"_npmUser":{"name":"i18n-now","email":"i18n.site@gmail.com"},"repository":{"url":"git+https://github.com/webc-site/npm.git","type":"git"},"_npmVersion":"11.16.0","description":"Public Suffix List implementation for domain suffix extraction.","directories":{},"_nodeVersion":"26.2.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/psl_0.1.0_1786606432178_0.793273631952252","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@1-/psl","version":"0.1.1","keywords":["cookie","domain","psl","public-suffix","tld"],"author":{"name":"x-at-01@googlegroups.com"},"license":"MulanPSL-2.0","_id":"@1-/psl@0.1.1","maintainers":[{"name":"i18n-now","email":"i18n.site@gmail.com"}],"homepage":"https://github.com/webc-site/npm/tree/main/psl","bugs":{"url":"https://github.com/webc-site/npm/issues"},"dist":{"shasum":"ad5962c96d8c55f95b5d17c525c7c2e3cc8be352","tarball":"https://registry.npmjs.org/@1-/psl/-/psl-0.1.1.tgz","fileCount":4,"integrity":"sha512-7kUeexQMAsj5nALrcO+9lheOR3dsZ18wAWU9rOwpXVQQsnyYJM0DclR+3dFXKq/wBNK7BRRwbfAMo3zBt/d2qQ==","signatures":[{"sig":"MEQCIC9G6EQA4Bx8hWD4Muti0s1eHHYFrd3S4fsTtd6qkP0mAiBnXTb2NTA++tmsghyh4DNmFJNnrDXm+jgcbCsW2jwk5A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121486},"type":"module","exports":{".":"./_.js","./*":"./*"},"_npmUser":{"name":"i18n-now","email":"i18n.site@gmail.com"},"repository":{"url":"git+https://github.com/webc-site/npm.git","type":"git"},"_npmVersion":"11.16.0","description":"Public Suffix List implementation for domain suffix extraction.","directories":{},"_nodeVersion":"26.2.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/psl_0.1.1_1786608930581_0.9125994423307526","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@1-/psl","version":"0.1.2","keywords":["cookie","domain","psl","public-suffix","tld"],"author":{"name":"x-at-01@googlegroups.com"},"license":"MulanPSL-2.0","_id":"@1-/psl@0.1.2","maintainers":[{"name":"i18n-now","email":"i18n.site@gmail.com"}],"homepage":"https://github.com/webc-site/npm/tree/main/psl","bugs":{"url":"https://github.com/webc-site/npm/issues"},"dist":{"shasum":"8fa595fc07d97a0eb3be7353b721793220f2577a","tarball":"https://registry.npmjs.org/@1-/psl/-/psl-0.1.2.tgz","fileCount":4,"integrity":"sha512-hrJJhwCWupLSbr595YVcUZtksD1kjQBJBy07iFP2gHRl6fZujsMnjLemry2iSMSBMtQeSfFrSyRUQIwDtCOZ5Q==","signatures":[{"sig":"MEUCIBqU5sVAC6bzBvkMJWurw06EES1iomq9qtFs7qc5beh6AiEAimBHi35nga9RRQ5oirf42iUB6oQRtXM2yhvDDf2VfyQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121294},"type":"module","exports":{".":"./_.js","./*":"./*"},"_npmUser":{"name":"i18n-now","email":"i18n.site@gmail.com"},"repository":{"url":"git+https://github.com/webc-site/npm.git","type":"git"},"_npmVersion":"11.16.0","description":"Public Suffix List implementation for domain suffix extraction.","directories":{},"_nodeVersion":"26.2.0","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/psl_0.1.2_1786690966741_0.918409726415133","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@1-/psl","version":"0.1.3","keywords":["cookie","domain","psl","public-suffix","tld"],"author":{"name":"x-at-01@googlegroups.com"},"license":"MulanPSL-2.0","_id":"@1-/psl@0.1.3","maintainers":[{"name":"i18n-now","email":"i18n.site@gmail.com"}],"homepage":"https://github.com/webc-site/npm/tree/main/psl","bugs":{"url":"https://github.com/webc-site/npm/issues"},"dist":{"shasum":"dbcbf01ea0df997f328eaf65b68be1b3b0557a8d","tarball":"https://registry.npmjs.org/@1-/psl/-/psl-0.1.3.tgz","fileCount":4,"integrity":"sha512-bbO57zIa0GZKornaiiKqs4HfbgnmN6r6acUmO74BF9ra9+/imB+je47LuZ3EcHxN8bgU6DOwS9egSsnB2Upy7A==","signatures":[{"sig":"MEUCIQDDp9BcOv93jtnZUYlnjtn9A76lpcW7U+OIwdm/zmmDfAIgZwCrV8//PYkUCBSUB8vJwyPr8S8E1uQn4ORJR0JaoVY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121332},"type":"module","exports":{".":"./_.js","./*":"./*"},"_npmUser":{"name":"i18n-now","email":"i18n.site@gmail.com"},"repository":{"url":"git+https://github.com/webc-site/npm.git","type":"git"},"_npmVersion":"11.16.0","description":"Public Suffix List implementation for domain suffix extraction.","directories":{},"_nodeVersion":"26.2.0","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/psl_0.1.3_1786691639885_0.2965339111195766","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@1-/psl","version":"0.1.4","description":"Public Suffix List implementation for domain suffix extraction.","keywords":["cookie","domain","psl","public-suffix","tld"],"homepage":"https://github.com/webc-site/npm/tree/main/psl","license":"MulanPSL-2.0","author":{"name":"x-at-01@googlegroups.com"},"repository":{"type":"git","url":"git+https://github.com/webc-site/npm.git"},"type":"module","exports":{".":"./_.js","./*":"./*"},"dependencies":{},"_id":"@1-/psl@0.1.4","bugs":{"url":"https://github.com/webc-site/npm/issues"},"_nodeVersion":"26.2.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-6lZow5YqctJAtZU0/Ev7pWsR0fZI3F8DG+WrRnuB6U4GDU8PnOOXC7EHvNG+/wycfIaPjXOVH+8ZQhRgP5+/9A==","shasum":"1b329e2226d0c801197216b114b2913613eecffb","tarball":"https://registry.npmjs.org/@1-/psl/-/psl-0.1.4.tgz","fileCount":4,"unpackedSize":121180,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGLHGBxUGbXAsdizy7DIC7y5gsDop/yonbkTsk4WNlwyAiB0vqUDWITigk9s5xqnHQydzbkbtNDTP5dReiGdnrdoqg=="}]},"_npmUser":{"name":"i18n-now","email":"i18n.site@gmail.com"},"directories":{},"maintainers":[{"name":"i18n-now","email":"i18n.site@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/psl_0.1.4_1787040397677_0.9548884568470368"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-13T07:33:51.979Z","modified":"2026-08-18T08:06:38.014Z","0.1.0":"2026-08-13T07:33:52.304Z","0.1.1":"2026-08-13T08:15:30.741Z","0.1.2":"2026-08-14T07:02:46.873Z","0.1.3":"2026-08-14T07:14:00.031Z","0.1.4":"2026-08-18T08:06:37.832Z"},"bugs":{"url":"https://github.com/webc-site/npm/issues"},"author":{"name":"x-at-01@googlegroups.com"},"license":"MulanPSL-2.0","homepage":"https://github.com/webc-site/npm/tree/main/psl","keywords":["cookie","domain","psl","public-suffix","tld"],"repository":{"type":"git","url":"git+https://github.com/webc-site/npm.git"},"description":"Public Suffix List implementation for domain suffix extraction.","maintainers":[{"name":"i18n-now","email":"i18n.site@gmail.com"}],"readme":"[English](#en) | [中文](#zh)\n\n---\n\n<a id=\"en\"></a>\n# @1-/psl : Domain public suffix extraction library\n\n- [@1-/psl : Domain public suffix extraction library](#1-psl-domain-public-suffix-extraction-library)\n  - [Functionality](#functionality)\n  - [Usage demonstration](#usage-demonstration)\n  - [Design rationale](#design-rationale)\n  - [Technology stack](#technology-stack)\n  - [Code structure](#code-structure)\n  - [Historical background](#historical-background)\n  - [About](#about)\n\n## Functionality\n\nExtract public suffixes from domain names using Mozilla's Public Suffix List specification. Supports ICANN domains plus private domains like github.io, pages.dev, and vercel.app.\n\nAccurately handle all PSL rule types: normal domains (com), wildcard rules (*.co.uk), and exception rules (!foo.co.uk) to ensure correct registrable domain determination.\n\n## Usage demonstration\n\nInstall the package:\n\n```bash\nnpm install @1-/psl\n```\n\nUse in JavaScript:\n\n```javascript\nimport psl from \"@1-/psl\";\n\n// Extract public suffix\nconsole.log(psl(\"www.github.com\")); // 'github.com'\nconsole.log(psl(\"blog.example.co.uk\")); // 'example.co.uk'\nconsole.log(psl(\"subdomain.google.com\")); // 'google.com'\nconsole.log(psl(\"user.github.io\")); // 'user.github.io'\nconsole.log(psl(\"app.vercel.app\")); // 'app.vercel.app'\n```\n\n## Design rationale\n\nUses a compressed reverse trie structure optimized for memory efficiency and fast lookup:\n\n- Leaf nodes store type codes (1=normal, 2=wildcard, 3=exception)\n- Internal nodes use array format `[type, {children}]` when typed, object format `{children}` when untyped\n- Domain parts are stored in reverse order for efficient right-to-left traversal\n\n![](https://cdn.jsdmirror.com/gh/webc-fs/-@W1/Xwqri0UVJvLdHvvNlgIA.svg)\n\n## Technology stack\n\n- Pure JavaScript implementation\n- ES Module format\n- No external dependencies\n- Generated from official Public Suffix List data\n- Optimized for both Node.js and browser environments\n\n## Code structure\n\n```\nsrc/\n├── psl.js          # Compressed Public Suffix List trie data\n└── _.js            # Lookup function implementing PSL specification\n\ntest/\n├── _.test.js       # Functional tests with real domain examples\n└── psl.test.js     # Structural validation tests\n\ngen.js              # Data generation script (downloads and compresses PSL)\nallow.js            # Configuration for private domains to include\n```\n\n## Historical background\n\nThe Public Suffix List originated at Mozilla in 2007 to solve cookie scoping vulnerabilities. Before PSL, browsers couldn't distinguish between domains controlled by registrars (like co.uk) versus end users (like example.co.uk), enabling malicious sites to set cookies on overly broad domains. This implementation follows the current PSL specification while adding support for modern hosting platforms like GitHub Pages, Vercel, and Netlify.\n\n## About\n\nThis library is developed by [WebC.site](https://webc.site).\n\n[WebC.site](https://webc.site): A new paradigm of web development for AI\n\n\n---\n\n<a id=\"zh\"></a>\n# @1-/psl : 域名公共后缀提取库\n\n- [@1-/psl : 域名公共后缀提取库](#1-psl-域名公共后缀提取库)\n  - [功能介绍](#功能介绍)\n  - [使用演示](#使用演示)\n  - [设计思路](#设计思路)\n  - [技术栈](#技术栈)\n  - [代码结构](#代码结构)\n  - [历史故事](#历史故事)\n  - [关于](#关于)\n\n## 功能介绍\n\n使用 Mozilla 公共后缀列表规范从域名中提取公共后缀。支持 ICANN 域名及 github.io、pages.dev、vercel.app 等现代托管平台的私有域名。\n\n准确处理所有 PSL 规则类型：普通域名（com）、通配符规则（*.co.uk）和例外规则（!foo.co.uk），确保可注册域名判定正确。\n\n## 使用演示\n\n安装包：\n\n```bash\nnpm install @1-/psl\n```\n\nJavaScript 中使用：\n\n```javascript\nimport psl from \"@1-/psl\";\n\n// 提取公共后缀\nconsole.log(psl(\"www.github.com\")); // 'github.com'\nconsole.log(psl(\"blog.example.co.uk\")); // 'example.co.uk'\nconsole.log(psl(\"subdomain.google.com\")); // 'google.com'\nconsole.log(psl(\"user.github.io\")); // 'user.github.io'\nconsole.log(psl(\"app.vercel.app\")); // 'app.vercel.app'\n```\n\n## 设计思路\n\n采用压缩的反向 Trie 结构，针对内存效率和快速查找优化：\n\n- 叶节点存储类型码（1=普通，2=通配符，3=例外）\n- 内部节点在有类型时使用数组格式 `[类型, {子节点}]`，无类型时使用对象格式 `{子节点}`\n- 域名部分按逆序存储，支持高效的从右向左遍历\n\n![](https://cdn.jsdmirror.com/gh/webc-fs/-@po/Agym2K0x87d2sbcmE3UA.svg)\n\n## 技术栈\n\n- 纯 JavaScript 实现\n- ES 模块格式\n- 无外部依赖\n- 基于官方公共后缀列表数据生成\n- 针对 Node.js 和浏览器环境优化\n\n## 代码结构\n\n```\nsrc/\n├── psl.js          # 压缩的公共后缀列表 Trie 数据\n└── _.js            # 实现 PSL 规范的查找函数\n\ntest/\n├── _.test.js       # 功能测试（含真实域名示例）\n└── psl.test.js     # 结构验证测试\n\ngen.js              # 数据生成脚本（下载并压缩 PSL）\nallow.js            # 私有域名包含配置\n```\n\n## 历史故事\n\n公共后缀列表起源于 Mozilla 2007 年，旨在解决 Cookie 范围漏洞问题。在 PSL 出现前，浏览器无法区分由注册商控制的域名（如 co.uk）与终端用户控制的域名（如 example.co.uk），导致恶意网站可在过于宽泛的域名上设置 Cookie。本实现遵循当前 PSL 规范，并增加对 GitHub Pages、Vercel、Netlify 等现代托管平台的支持。\n\n## 关于\n\n本库由 [WebC.site](https://webc.site) 开发。\n\n[WebC.site](https://webc.site) : 面向人工智能的网站开发新范式\n\n","readmeFilename":"README.md"}