Files
portfolio/node_modules/.cache/babel-loader/d0decf4f82869d1bb0c1298bc4f81282.json
2021-09-20 16:54:47 -04:00

1 line
19 KiB
JSON

{"ast":null,"code":"/*eslint no-var:0, prefer-arrow-callback: 0, object-shorthand: 0 */\n'use strict';\n\nvar Punycode = require('punycode');\n\nvar internals = {}; //\n// Read rules from file.\n//\n\ninternals.rules = require('./data/rules.json').map(function (rule) {\n return {\n rule: rule,\n suffix: rule.replace(/^(\\*\\.|\\!)/, ''),\n punySuffix: -1,\n wildcard: rule.charAt(0) === '*',\n exception: rule.charAt(0) === '!'\n };\n}); //\n// Check is given string ends with `suffix`.\n//\n\ninternals.endsWith = function (str, suffix) {\n return str.indexOf(suffix, str.length - suffix.length) !== -1;\n}; //\n// Find rule for a given domain.\n//\n\n\ninternals.findRule = function (domain) {\n var punyDomain = Punycode.toASCII(domain);\n return internals.rules.reduce(function (memo, rule) {\n if (rule.punySuffix === -1) {\n rule.punySuffix = Punycode.toASCII(rule.suffix);\n }\n\n if (!internals.endsWith(punyDomain, '.' + rule.punySuffix) && punyDomain !== rule.punySuffix) {\n return memo;\n } // This has been commented out as it never seems to run. This is because\n // sub tlds always appear after their parents and we never find a shorter\n // match.\n //if (memo) {\n // var memoSuffix = Punycode.toASCII(memo.suffix);\n // if (memoSuffix.length >= punySuffix.length) {\n // return memo;\n // }\n //}\n\n\n return rule;\n }, null);\n}; //\n// Error codes and messages.\n//\n\n\nexports.errorCodes = {\n DOMAIN_TOO_SHORT: 'Domain name too short.',\n DOMAIN_TOO_LONG: 'Domain name too long. It should be no more than 255 chars.',\n LABEL_STARTS_WITH_DASH: 'Domain name label can not start with a dash.',\n LABEL_ENDS_WITH_DASH: 'Domain name label can not end with a dash.',\n LABEL_TOO_LONG: 'Domain name label should be at most 63 chars long.',\n LABEL_TOO_SHORT: 'Domain name label should be at least 1 character long.',\n LABEL_INVALID_CHARS: 'Domain name label can only contain alphanumeric characters or dashes.'\n}; //\n// Validate domain name and throw if not valid.\n//\n// From wikipedia:\n//\n// Hostnames are composed of series of labels concatenated with dots, as are all\n// domain names. Each label must be between 1 and 63 characters long, and the\n// entire hostname (including the delimiting dots) has a maximum of 255 chars.\n//\n// Allowed chars:\n//\n// * `a-z`\n// * `0-9`\n// * `-` but not as a starting or ending character\n// * `.` as a separator for the textual portions of a domain name\n//\n// * http://en.wikipedia.org/wiki/Domain_name\n// * http://en.wikipedia.org/wiki/Hostname\n//\n\ninternals.validate = function (input) {\n // Before we can validate we need to take care of IDNs with unicode chars.\n var ascii = Punycode.toASCII(input);\n\n if (ascii.length < 1) {\n return 'DOMAIN_TOO_SHORT';\n }\n\n if (ascii.length > 255) {\n return 'DOMAIN_TOO_LONG';\n } // Check each part's length and allowed chars.\n\n\n var labels = ascii.split('.');\n var label;\n\n for (var i = 0; i < labels.length; ++i) {\n label = labels[i];\n\n if (!label.length) {\n return 'LABEL_TOO_SHORT';\n }\n\n if (label.length > 63) {\n return 'LABEL_TOO_LONG';\n }\n\n if (label.charAt(0) === '-') {\n return 'LABEL_STARTS_WITH_DASH';\n }\n\n if (label.charAt(label.length - 1) === '-') {\n return 'LABEL_ENDS_WITH_DASH';\n }\n\n if (!/^[a-z0-9\\-]+$/.test(label)) {\n return 'LABEL_INVALID_CHARS';\n }\n }\n}; //\n// Public API\n//\n//\n// Parse domain.\n//\n\n\nexports.parse = function (input) {\n if (typeof input !== 'string') {\n throw new TypeError('Domain name must be a string.');\n } // Force domain to lowercase.\n\n\n var domain = input.slice(0).toLowerCase(); // Handle FQDN.\n // TODO: Simply remove trailing dot?\n\n if (domain.charAt(domain.length - 1) === '.') {\n domain = domain.slice(0, domain.length - 1);\n } // Validate and sanitise input.\n\n\n var error = internals.validate(domain);\n\n if (error) {\n return {\n input: input,\n error: {\n message: exports.errorCodes[error],\n code: error\n }\n };\n }\n\n var parsed = {\n input: input,\n tld: null,\n sld: null,\n domain: null,\n subdomain: null,\n listed: false\n };\n var domainParts = domain.split('.'); // Non-Internet TLD\n\n if (domainParts[domainParts.length - 1] === 'local') {\n return parsed;\n }\n\n var handlePunycode = function () {\n if (!/xn--/.test(domain)) {\n return parsed;\n }\n\n if (parsed.domain) {\n parsed.domain = Punycode.toASCII(parsed.domain);\n }\n\n if (parsed.subdomain) {\n parsed.subdomain = Punycode.toASCII(parsed.subdomain);\n }\n\n return parsed;\n };\n\n var rule = internals.findRule(domain); // Unlisted tld.\n\n if (!rule) {\n if (domainParts.length < 2) {\n return parsed;\n }\n\n parsed.tld = domainParts.pop();\n parsed.sld = domainParts.pop();\n parsed.domain = [parsed.sld, parsed.tld].join('.');\n\n if (domainParts.length) {\n parsed.subdomain = domainParts.pop();\n }\n\n return handlePunycode();\n } // At this point we know the public suffix is listed.\n\n\n parsed.listed = true;\n var tldParts = rule.suffix.split('.');\n var privateParts = domainParts.slice(0, domainParts.length - tldParts.length);\n\n if (rule.exception) {\n privateParts.push(tldParts.shift());\n }\n\n parsed.tld = tldParts.join('.');\n\n if (!privateParts.length) {\n return handlePunycode();\n }\n\n if (rule.wildcard) {\n tldParts.unshift(privateParts.pop());\n parsed.tld = tldParts.join('.');\n }\n\n if (!privateParts.length) {\n return handlePunycode();\n }\n\n parsed.sld = privateParts.pop();\n parsed.domain = [parsed.sld, parsed.tld].join('.');\n\n if (privateParts.length) {\n parsed.subdomain = privateParts.join('.');\n }\n\n return handlePunycode();\n}; //\n// Get domain.\n//\n\n\nexports.get = function (domain) {\n if (!domain) {\n return null;\n }\n\n return exports.parse(domain).domain || null;\n}; //\n// Check whether domain belongs to a known public suffix.\n//\n\n\nexports.isValid = function (domain) {\n var parsed = exports.parse(domain);\n return Boolean(parsed.domain && parsed.listed);\n};","map":{"version":3,"sources":["/Users/tylerkoenig/Code/personal/react-scss2/node_modules/psl/index.js"],"names":["Punycode","require","internals","rules","map","rule","suffix","replace","punySuffix","wildcard","charAt","exception","endsWith","str","indexOf","length","findRule","domain","punyDomain","toASCII","reduce","memo","exports","errorCodes","DOMAIN_TOO_SHORT","DOMAIN_TOO_LONG","LABEL_STARTS_WITH_DASH","LABEL_ENDS_WITH_DASH","LABEL_TOO_LONG","LABEL_TOO_SHORT","LABEL_INVALID_CHARS","validate","input","ascii","labels","split","label","i","test","parse","TypeError","slice","toLowerCase","error","message","code","parsed","tld","sld","subdomain","listed","domainParts","handlePunycode","pop","join","tldParts","privateParts","push","shift","unshift","get","isValid","Boolean"],"mappings":"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","sourcesContent":["/*eslint no-var:0, prefer-arrow-callback: 0, object-shorthand: 0 */\n'use strict';\n\n\nvar Punycode = require('punycode');\n\n\nvar internals = {};\n\n\n//\n// Read rules from file.\n//\ninternals.rules = require('./data/rules.json').map(function (rule) {\n\n return {\n rule: rule,\n suffix: rule.replace(/^(\\*\\.|\\!)/, ''),\n punySuffix: -1,\n wildcard: rule.charAt(0) === '*',\n exception: rule.charAt(0) === '!'\n };\n});\n\n\n//\n// Check is given string ends with `suffix`.\n//\ninternals.endsWith = function (str, suffix) {\n\n return str.indexOf(suffix, str.length - suffix.length) !== -1;\n};\n\n\n//\n// Find rule for a given domain.\n//\ninternals.findRule = function (domain) {\n\n var punyDomain = Punycode.toASCII(domain);\n return internals.rules.reduce(function (memo, rule) {\n\n if (rule.punySuffix === -1){\n rule.punySuffix = Punycode.toASCII(rule.suffix);\n }\n if (!internals.endsWith(punyDomain, '.' + rule.punySuffix) && punyDomain !== rule.punySuffix) {\n return memo;\n }\n // This has been commented out as it never seems to run. This is because\n // sub tlds always appear after their parents and we never find a shorter\n // match.\n //if (memo) {\n // var memoSuffix = Punycode.toASCII(memo.suffix);\n // if (memoSuffix.length >= punySuffix.length) {\n // return memo;\n // }\n //}\n return rule;\n }, null);\n};\n\n\n//\n// Error codes and messages.\n//\nexports.errorCodes = {\n DOMAIN_TOO_SHORT: 'Domain name too short.',\n DOMAIN_TOO_LONG: 'Domain name too long. It should be no more than 255 chars.',\n LABEL_STARTS_WITH_DASH: 'Domain name label can not start with a dash.',\n LABEL_ENDS_WITH_DASH: 'Domain name label can not end with a dash.',\n LABEL_TOO_LONG: 'Domain name label should be at most 63 chars long.',\n LABEL_TOO_SHORT: 'Domain name label should be at least 1 character long.',\n LABEL_INVALID_CHARS: 'Domain name label can only contain alphanumeric characters or dashes.'\n};\n\n\n//\n// Validate domain name and throw if not valid.\n//\n// From wikipedia:\n//\n// Hostnames are composed of series of labels concatenated with dots, as are all\n// domain names. Each label must be between 1 and 63 characters long, and the\n// entire hostname (including the delimiting dots) has a maximum of 255 chars.\n//\n// Allowed chars:\n//\n// * `a-z`\n// * `0-9`\n// * `-` but not as a starting or ending character\n// * `.` as a separator for the textual portions of a domain name\n//\n// * http://en.wikipedia.org/wiki/Domain_name\n// * http://en.wikipedia.org/wiki/Hostname\n//\ninternals.validate = function (input) {\n\n // Before we can validate we need to take care of IDNs with unicode chars.\n var ascii = Punycode.toASCII(input);\n\n if (ascii.length < 1) {\n return 'DOMAIN_TOO_SHORT';\n }\n if (ascii.length > 255) {\n return 'DOMAIN_TOO_LONG';\n }\n\n // Check each part's length and allowed chars.\n var labels = ascii.split('.');\n var label;\n\n for (var i = 0; i < labels.length; ++i) {\n label = labels[i];\n if (!label.length) {\n return 'LABEL_TOO_SHORT';\n }\n if (label.length > 63) {\n return 'LABEL_TOO_LONG';\n }\n if (label.charAt(0) === '-') {\n return 'LABEL_STARTS_WITH_DASH';\n }\n if (label.charAt(label.length - 1) === '-') {\n return 'LABEL_ENDS_WITH_DASH';\n }\n if (!/^[a-z0-9\\-]+$/.test(label)) {\n return 'LABEL_INVALID_CHARS';\n }\n }\n};\n\n\n//\n// Public API\n//\n\n\n//\n// Parse domain.\n//\nexports.parse = function (input) {\n\n if (typeof input !== 'string') {\n throw new TypeError('Domain name must be a string.');\n }\n\n // Force domain to lowercase.\n var domain = input.slice(0).toLowerCase();\n\n // Handle FQDN.\n // TODO: Simply remove trailing dot?\n if (domain.charAt(domain.length - 1) === '.') {\n domain = domain.slice(0, domain.length - 1);\n }\n\n // Validate and sanitise input.\n var error = internals.validate(domain);\n if (error) {\n return {\n input: input,\n error: {\n message: exports.errorCodes[error],\n code: error\n }\n };\n }\n\n var parsed = {\n input: input,\n tld: null,\n sld: null,\n domain: null,\n subdomain: null,\n listed: false\n };\n\n var domainParts = domain.split('.');\n\n // Non-Internet TLD\n if (domainParts[domainParts.length - 1] === 'local') {\n return parsed;\n }\n\n var handlePunycode = function () {\n\n if (!/xn--/.test(domain)) {\n return parsed;\n }\n if (parsed.domain) {\n parsed.domain = Punycode.toASCII(parsed.domain);\n }\n if (parsed.subdomain) {\n parsed.subdomain = Punycode.toASCII(parsed.subdomain);\n }\n return parsed;\n };\n\n var rule = internals.findRule(domain);\n\n // Unlisted tld.\n if (!rule) {\n if (domainParts.length < 2) {\n return parsed;\n }\n parsed.tld = domainParts.pop();\n parsed.sld = domainParts.pop();\n parsed.domain = [parsed.sld, parsed.tld].join('.');\n if (domainParts.length) {\n parsed.subdomain = domainParts.pop();\n }\n return handlePunycode();\n }\n\n // At this point we know the public suffix is listed.\n parsed.listed = true;\n\n var tldParts = rule.suffix.split('.');\n var privateParts = domainParts.slice(0, domainParts.length - tldParts.length);\n\n if (rule.exception) {\n privateParts.push(tldParts.shift());\n }\n\n parsed.tld = tldParts.join('.');\n\n if (!privateParts.length) {\n return handlePunycode();\n }\n\n if (rule.wildcard) {\n tldParts.unshift(privateParts.pop());\n parsed.tld = tldParts.join('.');\n }\n\n if (!privateParts.length) {\n return handlePunycode();\n }\n\n parsed.sld = privateParts.pop();\n parsed.domain = [parsed.sld, parsed.tld].join('.');\n\n if (privateParts.length) {\n parsed.subdomain = privateParts.join('.');\n }\n\n return handlePunycode();\n};\n\n\n//\n// Get domain.\n//\nexports.get = function (domain) {\n\n if (!domain) {\n return null;\n }\n return exports.parse(domain).domain || null;\n};\n\n\n//\n// Check whether domain belongs to a known public suffix.\n//\nexports.isValid = function (domain) {\n\n var parsed = exports.parse(domain);\n return Boolean(parsed.domain && parsed.listed);\n};\n"]},"metadata":{},"sourceType":"script"}