Catalog npm
Back to packageRELEASE DETAILS

2.2.7

npm

2domain

Splits an url into sub-domain, domain and effective top-level-domain

countrydomainextractparsesanitizesub-domaintldtop-levelurl
Published17 Oct 2018
Direct dependencies11
Transitive dependenciesNot calculated

README

Current package documentation

2domain

Splits a URL into sub-domain, domain and the top-level domain.

Since domains are handled differently across different countries and organizations, splitting a URL into sub-domain, domain and top-level-domain parts is not a simple regexp. 2domain uses a large list of known top-level domains from publicsuffix.org to recognize different parts of the domain.

This module uses a trie data structure under the hood to ensure the smallest possible library size and the fastest lookup. The library is roughly 30KB minified and gzipped. Since publicsuffix.org is frequently updated, the data structure is built on npm install as a postinstall hook. If something goes wrong during that step, the library falls back to a prebuilt list that has been built at the time of publishing.


Installation

npm install 2domain

Updating Database

You might need to update the database from time to time. Sometimes database downloading might fail and you might need to download it manually

node node-modules/2domain/scripts/build-tries.js

Updating Database Strategy

I suggest update the files from crontab regularly. This repo returns a 0 if build-tries was successfully tested by mocha. So you might crontab like node <path>/scripts/build-tries.js && node <path>/scrpits/write-pre.js This would download and store the files to pre/ folder if mocha tests were successfull. Why would you need a pre/ folder: imagine you get internet outage while executing build-tries.js then you might have invalid or broken data. build-tries.js automatically taking the content from pre/ in case of such an error. That is why it it important to keep pre/ up2date, to recover from emergency cases.

Probably you would need to restart your services if they run long term too, because the .json files are read from tries modules and kept in memory during lifetime of the service. You might want to keep restarting your long-running services regularly or build something to detect changes and restart

Usage

// long subdomains can be handled
expect(parseDomain("some.subdomain.example.co.uk")).to.eql({
    subdomain: "some.subdomain",
    domain: "example",
    tld: "co.uk"
});

// protocols, usernames, passwords, ports, paths, queries and hashes are disregarded
expect(parseDomain("https://user:password@example.co.uk:8080/some/path?and&query#hash")).to.eql({
    subdomain: "",
    domain: "example",
    tld: "co.uk"
});

// unknown top-level domains are ignored
expect(parseDomain("unknown.tld.kk")).to.equal(null);

// invalid urls are also ignored
expect(parseDomain("invalid url")).to.equal(null);
expect(parseDomain({})).to.equal(null);

Introducing custom tlds

// custom top-level domains can optionally be specified
expect(parseDomain("mymachine.local",{ customTlds: ["local"] })).to.eql({
    subdomain: "",
    domain: "mymachine",
    tld: "local"
});

// custom regexps can optionally be specified (instead of customTlds)
expect(parseDomain("localhost",{ customTlds:/localhost|\.local/ })).to.eql({
    subdomain: "",
    domain: "",
    tld: "localhost"
});

It can sometimes be helpful to apply the customTlds argument using a helper function

function parseLocalDomains(url) {
    return parseDomain(url, {
        customTlds: /localhost|\.local/
    });
}

expect(parseLocalDomains("localhost")).to.eql({
    subdomain: "",
    domain: "",
    tld: "localhost"
});
expect(parseLocalDomains("mymachine.local")).to.eql({
    subdomain: "",
    domain: "mymachine",
    tld: "local"
});

API

parseDomain(url: string, options: ParseOptions): ParsedDomain|null

Returns null if url has an unknown tld or if it's not a valid url.

ParseOptions

{
    // A list of custom tlds that are first matched against the url.
    // Useful if you also need to split internal URLs like localhost.
    customTlds: RegExp|Array<string>,
    
    // There are lot of private domains that act like top-level domains,
    // like blogspot.com, googleapis.com or s3.amazonaws.com.
    // By default, these domains would be split into:
    // { subdomain: ..., domain: "blogspot", tld: "com" }
    // When this flag is set to true, the domain will be split into
    // { subdomain: ..., domain: ..., tld: "blogspot.com" }
    // See also https://github.com/peerigon/parse-domain/issues/4
    privateTlds: boolean - default: false
}

ParsedDomain

{
    tld: string,
    domain: string,
    subdomain: string
}

Tests

cd <project_path>
node_modules/mocha/bin/mocha --recursive -R dot node_modules/2domain/test/

Forked

This repo was forked from peerigon and modified/extended

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Declared dependencies 11

Native requirements
11 direct targetsNot calculated transitive count
Package / targetRequirementRelationship
chai
Environment
{
  "local_name": "chai",
  "alias": false,
  "peer_metadata": null
}
^4.1.2runtime
fs-copy-file-sync
Environment
{
  "local_name": "fs-copy-file-sync",
  "alias": false,
  "peer_metadata": null
}
^1.1.1runtime
got
Environment
{
  "local_name": "got",
  "alias": false,
  "peer_metadata": null
}
^8.0.1runtime
mkdirp
Environment
{
  "local_name": "mkdirp",
  "alias": false,
  "peer_metadata": null
}
^0.5.1runtime
mocha
Environment
{
  "local_name": "mocha",
  "alias": false,
  "peer_metadata": null
}
^4.0.1runtime
eslint
Environment
{
  "local_name": "eslint",
  "alias": false,
  "peer_metadata": null
}
^4.12.1development
eslint-config-peerigon
Environment
{
  "local_name": "eslint-config-peerigon",
  "alias": false,
  "peer_metadata": null
}
^12.0.1development
eslint-plugin-import
Environment
{
  "local_name": "eslint-plugin-import",
  "alias": false,
  "peer_metadata": null
}
^2.8.0development
eslint-plugin-jsdoc
Environment
{
  "local_name": "eslint-plugin-jsdoc",
  "alias": false,
  "peer_metadata": null
}
^3.2.0development
nyc
Environment
{
  "local_name": "nyc",
  "alias": false,
  "peer_metadata": null
}
^11.3.0development
standard-version
Environment
{
  "local_name": "standard-version",
  "alias": false,
  "peer_metadata": null
}
^4.2.0development

Distribution files

1 collected
Distribution 1

Source distribution

Source file
Checksums from source
{
  "integrity": "sha512-98ildHwG06EjzEyMMTamC2QL6cP2853ItwMAuWPSBlnaVPJx8n7rbzF+DMQgovDGgKe0CWzySco2QKCU+3LXZg==",
  "shasum": "2b64f4cf7f3cf497d0747938ee03ea0590dcb177",
  "tarball": "https://registry.npmjs.org/2domain/-/2domain-2.2.7.tgz",
  "fileCount": 33,
  "unpackedSize": 619335,
  "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbx0jACRA9TVsSAnZWagAA0ScP/1aFugeqTjPNMwiHyBp4\nTZYpJTvd/zHBy2g4RJlN4vLgj+AFOeB3LPDe5kF2qXnueNEfwARwFzST7NiX\njlD2PwHKQLJc7g770LsgjaCcNTZ2AosUFx+DoiqcOB2yqo/brL4uT6x9b8Xl\nor0N+9uem7SbnaXrwTxlNxBARAhC4mmrdyvYszzS3EcVLTXs8bSfrCwcR4YI\nEWEA+yvKl+i9ffGECuzSzDvuDHLD4wv56eO/Tth6nRPhsQvUqEISLcKhjV1h\nNmU/XlfOCtke1RYoKf6ectZF1ERkgiiES9kLuOpfitQ4JlbifWeRIV5H0MAp\nYWwsnHqkBoKdhGKQrPkj6CCG9fNECX/Bh9EOLczYwwZAxo7kYNrYGtM6jueF\nTIDMxrYLCW9pe5SXYR7Gq/mNyVKXmr0dHcaP+AOYIaN8QaVQWjAU1/cczaP2\nCLMDtJLlXZXoaihUiBHXxUpodJy37sjDnzxtS6ZjznrB4CeJscGr963Orrld\nEdI9S1zKceIpNKdxom0byjv9cJRe7/6U0zjLEV1eNW2/UuD/F+sI8xsK6+Dk\nYBiIOmjc2tYiAwZdxhbFEJEfzQzShhF3TaqBEaa23mZETuHrDdpOQ8j8uao0\n8X/WzOC3ef+Z1NfNPXiZ8MsGSXJeB0DK2YabUOInbBDxt1CTLi8y3sqnSyCj\nLqHy\r\n=wEsl\r\n-----END PGP SIGNATURE-----\r\n",
  "signatures": [
    {
      "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA",
      "sig": "MEUCIDGQgFcIXInOPcZsW33jvgReN4CVEMoW20lL1J+vBzCcAiEAzNljY5nY7Sjl4b5eF50RPPC9XaMuQh/XOZp5p+eVd0I="
    }
  ]
}

Repository

PENDING
7c/2domain

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 19:11 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package_version:9c06c2bfae2dfaa6deb559b0aae588bbef2ae29f26c1edcd551c396d36461d40

Other collected versions

2.2.1118 Dec2.2.1031 Oct2.2.917 Oct2.2.817 Oct2.2.615 Oct2.2.515 OctView all collected versions →