; | |
Object.defineProperty(exports, "__esModule", { value: true }); | |
exports.permuteDomain = permuteDomain; | |
const getPublicSuffix_1 = require("./getPublicSuffix"); | |
/** | |
* Generates the permutation of all possible values that {@link domainMatch} the given `domain` parameter. The | |
* array is in shortest-to-longest order. Useful when building custom {@link Store} implementations. | |
* | |
* @example | |
* ``` | |
* permuteDomain('foo.bar.example.com') | |
* // ['example.com', 'bar.example.com', 'foo.bar.example.com'] | |
* ``` | |
* | |
* @public | |
* @param domain - the domain to generate permutations for | |
* @param allowSpecialUseDomain - flag to control if {@link https://www.rfc-editor.org/rfc/rfc6761.html | Special Use Domains} such as `localhost` should be allowed | |
*/ | |
function permuteDomain(domain, allowSpecialUseDomain) { | |
const pubSuf = (0, getPublicSuffix_1.getPublicSuffix)(domain, { | |
allowSpecialUseDomain: allowSpecialUseDomain, | |
}); | |
if (!pubSuf) { | |
return undefined; | |
} | |
if (pubSuf == domain) { | |
return [domain]; | |
} | |
// Nuke trailing dot | |
if (domain.slice(-1) == '.') { | |
domain = domain.slice(0, -1); | |
} | |
const prefix = domain.slice(0, -(pubSuf.length + 1)); // ".example.com" | |
const parts = prefix.split('.').reverse(); | |
let cur = pubSuf; | |
const permutations = [cur]; | |
while (parts.length) { | |
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion | |
const part = parts.shift(); | |
cur = `${part}.${cur}`; | |
permutations.push(cur); | |
} | |
return permutations; | |
} | |