Beta 7 with some repo names changed.
This commit is contained in:
1 parent
0f7b40cca7
commit
963c19493a
3408 files changed
+462217
-15516
No files matched your search
+8834
File diff suppressed because it is too large.
Load diff
+9645
File diff suppressed because it is too large.
Load diff
+1
@@ -0,0 +1 @@
|
||||
!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).psl=a()}}(function(){return function s(m,t,u){function r(o,a){if(!t[o]){if(!m[o]){var i="function"==typeof require&&require;if(!a&&i)return i(o,!0);if(p)return p(o,!0);var e=new Error("Cannot find module '"+o+"'");throw e.code="MODULE_NOT_FOUND",e}var n=t[o]={exports:{}};m[o][0].call(n.exports,function(a){return r(m[o][1][a]||a)},n,n.exports,s,m,t,u)}return t[o].exports}for(var p="function"==typeof require&&require,a=0;a<u.length;a++)r(u[a]);return r}({1:[function(a,o,i){o.exports=["ac","com.ac","edu.ac","gov.ac","net.ac","mil.ac","org.ac","ad","nom.ad","ae","co.ae","net.ae","org.ae","sch.ae","ac.ae","gov.ae","mil.ae","aero","accident-investigation.aero","accident-prevention.aero","aerobatic.aero","aeroclub.aero","aerodrome.aero","agents.aero","aircraft.aero","airline.aero","airport.aero","air-surveillance.aero","airtraffic.aero","air-traffic-control.aero","ambulance.aero","amusement.aero","association.aero","author.aero","ballooning.aero","broker.aero","caa.aero","cargo.aero","catering.aero","certification.aero","championship.aero","charter.aero","civilaviation.aero","club.aero","conference.aero","consultant.aero","consulting.aero","control.aero","council.aero","crew.aero","design.aero","dgca.aero","educator.aero","emergency.aero","engine.aero","engineer.aero","entertainment.aero","equipment.aero","exchange.aero","express.aero","federation.aero","flight.aero","freight.aero","fuel.aero","gliding.aero","government.aero","groundhandling.aero","group.aero","hanggliding.aero","homebuilt.aero","insurance.aero","journal.aero","journalist.aero","leasing.aero","logistics.aero","magazine.aero","maintenance.aero","media.aero","microlight.aero","modelling.aero","navigation.aero","parachuting.aero","paragliding.aero","passenger-association.aero","pilot.aero","press.aero","production.aero","recreation.aero","repbody.aero","res.aero","research.aero","rotorcraft.aero","safety.aero","scientist.aero","services.aero","show.aero","skydiving.aero","software.aero","student.aero","trader.aero","trading.aero","trainer.aero","union.aero","workinggroup.aero","works.aero","af","gov.af","com.af","org.af","net.af","edu.af","ag","com.ag","org.ag","net.ag","co.ag","nom.ag","ai","off.ai","com.ai","net.ai","org.ai","al","com.al","edu.al","gov.al","mil.al","net.al","org.al","am","co.am","com.am","commune.am","net.am","org.am","ao","ed.ao","gv.ao","og.ao","co.ao","pb.ao","it.ao","aq","ar","com.ar","edu.ar","gob.ar","gov.ar","int.ar","mil.ar","musica.ar","net.ar","org.ar","tur.ar","arpa","e164.arpa","in-addr.arpa","ip6.arpa","iris.arpa","uri.arpa","urn.arpa","as","gov.as","asia","at","ac.at","co.at","gv.at","or.at","au","com.au","net.au","org.au","edu.au","gov.au","asn.au","id.au","info.au","conf.au","oz.au","act.au","nsw.au","nt.au","qld.au","sa.au","tas.au","vic.au","wa.au","act.edu.au","catholic.edu.au","nsw.edu.au","nt.edu.au","qld.edu.au","sa.edu.au","tas.edu.au","vic.edu.au","wa.edu.au","qld.gov.au","sa.gov.au","tas.gov.au","vic.gov.au","wa.gov.au","education.tas.edu.au","schools.nsw.edu.au","aw","com.aw","ax","az","com.az","net.az","int.az","gov.az","org.az","edu.az","info.az","pp.az","mil.az","name.az","pro.az","biz.az","ba","com.ba","edu.ba","gov.ba","mil.ba","net.ba","org.ba","bb","biz.bb","co.bb","com.bb","edu.bb","gov.bb","info.bb","net.bb","org.bb","store.bb","tv.bb","*.bd","be","ac.be","bf","gov.bf","bg","a.bg","b.bg","c.bg","d.bg","e.bg","f.bg","g.bg","h.bg","i.bg","j.bg","k.bg","l.bg","m.bg","n.bg","o.bg","p.bg","q.bg","r.bg","s.bg","t.bg","u.bg","v.bg","w.bg","x.bg","y.bg","z.bg","0.bg","1.bg","2.bg","3.bg","4.bg","5.bg","6.bg","7.bg","8.bg","9.bg","bh","com.bh","edu.bh","net.bh","org.bh","gov.bh","bi","co.bi","com.bi","edu.bi","or.bi","org.bi","biz","bj","asso.bj","barreau.bj","gouv.bj","bm","com.bm","edu.bm","gov.bm","net.bm","org.bm","bn","com.bn","edu.bn","gov.bn","net.bn","org.bn","bo","com.bo","edu.bo","gob.bo","int.bo","org.bo","net.bo","mil.bo","tv.bo","web.bo","academia.bo","agro.bo","arte.bo","blog.bo","bolivia.bo","ciencia.bo","cooperativa.bo","democracia.bo","deporte.bo","ecologia.bo","economia.bo","empresa.bo","indigena.bo","industria.bo","info.bo","medicina.bo","movimiento.bo","musica.bo","natural.bo","nombre.bo","noticias.bo","patria.bo","politica.bo","profesional.bo","plurinacional.bo","pueblo.bo","revista.bo","salud.bo","tecnologia.bo","tksat.bo","transporte.bo","wiki.bo","br","9guacu.br","abc.br","adm.br","adv.br","agr.br","aju.br","am.br","anani.br","aparecida.br","arq.br","art.br","ato.br","b.br","barueri.br","belem.br","bhz.br","bio.br","blog.br","bmd.br","boavista.br","bsb.br","campinagrande.br","campinas.br","caxias.br","cim.br","cng.br","cnt.br","com.br","contagem.br","coop.br","cri.br","cuiaba.br","curitiba.br","def.br","ecn.br","eco.br","edu.br",Line truncated
|
||||
+269
@@ -0,0 +1,269 @@
|
||||
/*eslint no-var:0, prefer-arrow-callback: 0, object-shorthand: 0 */
|
||||
'use strict';
|
||||
|
||||
|
||||
var Punycode = require('punycode');
|
||||
|
||||
|
||||
var internals = {};
|
||||
|
||||
|
||||
//
|
||||
// Read rules from file.
|
||||
//
|
||||
internals.rules = require('./data/rules.json').map(function (rule) {
|
||||
|
||||
return {
|
||||
rule: rule,
|
||||
suffix: rule.replace(/^(\*\.|\!)/, ''),
|
||||
punySuffix: -1,
|
||||
wildcard: rule.charAt(0) === '*',
|
||||
exception: rule.charAt(0) === '!'
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
//
|
||||
// Check is given string ends with `suffix`.
|
||||
//
|
||||
internals.endsWith = function (str, suffix) {
|
||||
|
||||
return str.indexOf(suffix, str.length - suffix.length) !== -1;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// Find rule for a given domain.
|
||||
//
|
||||
internals.findRule = function (domain) {
|
||||
|
||||
var punyDomain = Punycode.toASCII(domain);
|
||||
return internals.rules.reduce(function (memo, rule) {
|
||||
|
||||
if (rule.punySuffix === -1){
|
||||
rule.punySuffix = Punycode.toASCII(rule.suffix);
|
||||
}
|
||||
if (!internals.endsWith(punyDomain, '.' + rule.punySuffix) && punyDomain !== rule.punySuffix) {
|
||||
return memo;
|
||||
}
|
||||
// This has been commented out as it never seems to run. This is because
|
||||
// sub tlds always appear after their parents and we never find a shorter
|
||||
// match.
|
||||
//if (memo) {
|
||||
// var memoSuffix = Punycode.toASCII(memo.suffix);
|
||||
// if (memoSuffix.length >= punySuffix.length) {
|
||||
// return memo;
|
||||
// }
|
||||
//}
|
||||
return rule;
|
||||
}, null);
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// Error codes and messages.
|
||||
//
|
||||
exports.errorCodes = {
|
||||
DOMAIN_TOO_SHORT: 'Domain name too short.',
|
||||
DOMAIN_TOO_LONG: 'Domain name too long. It should be no more than 255 chars.',
|
||||
LABEL_STARTS_WITH_DASH: 'Domain name label can not start with a dash.',
|
||||
LABEL_ENDS_WITH_DASH: 'Domain name label can not end with a dash.',
|
||||
LABEL_TOO_LONG: 'Domain name label should be at most 63 chars long.',
|
||||
LABEL_TOO_SHORT: 'Domain name label should be at least 1 character long.',
|
||||
LABEL_INVALID_CHARS: 'Domain name label can only contain alphanumeric characters or dashes.'
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// Validate domain name and throw if not valid.
|
||||
//
|
||||
// From wikipedia:
|
||||
//
|
||||
// Hostnames are composed of series of labels concatenated with dots, as are all
|
||||
// domain names. Each label must be between 1 and 63 characters long, and the
|
||||
// entire hostname (including the delimiting dots) has a maximum of 255 chars.
|
||||
//
|
||||
// Allowed chars:
|
||||
//
|
||||
// * `a-z`
|
||||
// * `0-9`
|
||||
// * `-` but not as a starting or ending character
|
||||
// * `.` as a separator for the textual portions of a domain name
|
||||
//
|
||||
// * http://en.wikipedia.org/wiki/Domain_name
|
||||
// * http://en.wikipedia.org/wiki/Hostname
|
||||
//
|
||||
internals.validate = function (input) {
|
||||
|
||||
// Before we can validate we need to take care of IDNs with unicode chars.
|
||||
var ascii = Punycode.toASCII(input);
|
||||
|
||||
if (ascii.length < 1) {
|
||||
return 'DOMAIN_TOO_SHORT';
|
||||
}
|
||||
if (ascii.length > 255) {
|
||||
return 'DOMAIN_TOO_LONG';
|
||||
}
|
||||
|
||||
// Check each part's length and allowed chars.
|
||||
var labels = ascii.split('.');
|
||||
var label;
|
||||
|
||||
for (var i = 0; i < labels.length; ++i) {
|
||||
label = labels[i];
|
||||
if (!label.length) {
|
||||
return 'LABEL_TOO_SHORT';
|
||||
}
|
||||
if (label.length > 63) {
|
||||
return 'LABEL_TOO_LONG';
|
||||
}
|
||||
if (label.charAt(0) === '-') {
|
||||
return 'LABEL_STARTS_WITH_DASH';
|
||||
}
|
||||
if (label.charAt(label.length - 1) === '-') {
|
||||
return 'LABEL_ENDS_WITH_DASH';
|
||||
}
|
||||
if (!/^[a-z0-9\-]+$/.test(label)) {
|
||||
return 'LABEL_INVALID_CHARS';
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// Public API
|
||||
//
|
||||
|
||||
|
||||
//
|
||||
// Parse domain.
|
||||
//
|
||||
exports.parse = function (input) {
|
||||
|
||||
if (typeof input !== 'string') {
|
||||
throw new TypeError('Domain name must be a string.');
|
||||
}
|
||||
|
||||
// Force domain to lowercase.
|
||||
var domain = input.slice(0).toLowerCase();
|
||||
|
||||
// Handle FQDN.
|
||||
// TODO: Simply remove trailing dot?
|
||||
if (domain.charAt(domain.length - 1) === '.') {
|
||||
domain = domain.slice(0, domain.length - 1);
|
||||
}
|
||||
|
||||
// Validate and sanitise input.
|
||||
var error = internals.validate(domain);
|
||||
if (error) {
|
||||
return {
|
||||
input: input,
|
||||
error: {
|
||||
message: exports.errorCodes[error],
|
||||
code: error
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
var parsed = {
|
||||
input: input,
|
||||
tld: null,
|
||||
sld: null,
|
||||
domain: null,
|
||||
subdomain: null,
|
||||
listed: false
|
||||
};
|
||||
|
||||
var domainParts = domain.split('.');
|
||||
|
||||
// Non-Internet TLD
|
||||
if (domainParts[domainParts.length - 1] === 'local') {
|
||||
return parsed;
|
||||
}
|
||||
|
||||
var handlePunycode = function () {
|
||||
|
||||
if (!/xn--/.test(domain)) {
|
||||
return parsed;
|
||||
}
|
||||
if (parsed.domain) {
|
||||
parsed.domain = Punycode.toASCII(parsed.domain);
|
||||
}
|
||||
if (parsed.subdomain) {
|
||||
parsed.subdomain = Punycode.toASCII(parsed.subdomain);
|
||||
}
|
||||
return parsed;
|
||||
};
|
||||
|
||||
var rule = internals.findRule(domain);
|
||||
|
||||
// Unlisted tld.
|
||||
if (!rule) {
|
||||
if (domainParts.length < 2) {
|
||||
return parsed;
|
||||
}
|
||||
parsed.tld = domainParts.pop();
|
||||
parsed.sld = domainParts.pop();
|
||||
parsed.domain = [parsed.sld, parsed.tld].join('.');
|
||||
if (domainParts.length) {
|
||||
parsed.subdomain = domainParts.pop();
|
||||
}
|
||||
return handlePunycode();
|
||||
}
|
||||
|
||||
// At this point we know the public suffix is listed.
|
||||
parsed.listed = true;
|
||||
|
||||
var tldParts = rule.suffix.split('.');
|
||||
var privateParts = domainParts.slice(0, domainParts.length - tldParts.length);
|
||||
|
||||
if (rule.exception) {
|
||||
privateParts.push(tldParts.shift());
|
||||
}
|
||||
|
||||
parsed.tld = tldParts.join('.');
|
||||
|
||||
if (!privateParts.length) {
|
||||
return handlePunycode();
|
||||
}
|
||||
|
||||
if (rule.wildcard) {
|
||||
tldParts.unshift(privateParts.pop());
|
||||
parsed.tld = tldParts.join('.');
|
||||
}
|
||||
|
||||
if (!privateParts.length) {
|
||||
return handlePunycode();
|
||||
}
|
||||
|
||||
parsed.sld = privateParts.pop();
|
||||
parsed.domain = [parsed.sld, parsed.tld].join('.');
|
||||
|
||||
if (privateParts.length) {
|
||||
parsed.subdomain = privateParts.join('.');
|
||||
}
|
||||
|
||||
return handlePunycode();
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// Get domain.
|
||||
//
|
||||
exports.get = function (domain) {
|
||||
|
||||
if (!domain) {
|
||||
return null;
|
||||
}
|
||||
return exports.parse(domain).domain || null;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// Check whether domain belongs to a known public suffix.
|
||||
//
|
||||
exports.isValid = function (domain) {
|
||||
|
||||
var parsed = exports.parse(domain);
|
||||
return Boolean(parsed.domain && parsed.listed);
|
||||
};
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"name": "psl",
|
||||
"version": "1.8.0",
|
||||
"description": "Domain name parser based on the Public Suffix List",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git@github.com:lupomontero/psl.git"
|
||||
},
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"pretest": "eslint .",
|
||||
"test": "mocha test && karma start ./karma.conf.js --single-run",
|
||||
"watch": "mocha test --watch",
|
||||
"prebuild": "./scripts/update-rules.js",
|
||||
"build": "browserify ./index.js --standalone=psl > ./dist/psl.js",
|
||||
"postbuild": "cat ./dist/psl.js | uglifyjs -c -m > ./dist/psl.min.js",
|
||||
"commit-and-pr": "commit-and-pr",
|
||||
"changelog": "git log $(git describe --tags --abbrev=0)..HEAD --oneline --format=\"%h %s (%an <%ae>)\""
|
||||
},
|
||||
"keywords": [
|
||||
"publicsuffix",
|
||||
"publicsuffixlist"
|
||||
],
|
||||
"author": "Lupo Montero <lupomontero@gmail.com> (https://lupomontero.com/)",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"JSONStream": "^1.3.5",
|
||||
"browserify": "^16.5.0",
|
||||
"commit-and-pr": "^1.0.4",
|
||||
"eslint": "^6.8.0",
|
||||
"eslint-config-hapi": "^12.0.0",
|
||||
"eslint-plugin-hapi": "^4.1.0",
|
||||
"karma": "^4.4.1",
|
||||
"karma-browserify": "^7.0.0",
|
||||
"karma-mocha": "^1.3.0",
|
||||
"karma-mocha-reporter": "^2.2.5",
|
||||
"karma-phantomjs-launcher": "^1.0.4",
|
||||
"mocha": "^7.1.1",
|
||||
"phantomjs-prebuilt": "^2.1.16",
|
||||
"request": "^2.88.2",
|
||||
"uglify-js": "^3.8.0",
|
||||
"watchify": "^3.11.1"
|
||||
}
|
||||
|
||||
,"_resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz"
|
||||
,"_integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
|
||||
,"_from": "psl@^1.1.28"
|
||||
}
|
||||
Reference in new issue
Block a user