You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
2.0 KiB

// Packages
const chalk = require('chalk');
// Ours
const Now = require('../lib');
const isZeitWorld = require('./is-zeit-world');
const { DNS_VERIFICATION_ERROR } = require('./errors');
const domainRegex = /^((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}$/;
module.exports = class Domains extends Now {
async ls() {
return this.listDomains();
}
async rm(name) {
return this.retry(async (bail, attempt) => {
if (this._debug) {
console.time(`> [debug] #${attempt} DELETE /domains/${name}`);
}
const res = await this._fetch(`/domains/${name}`, { method: 'DELETE' });
if (this._debug) {
console.timeEnd(`> [debug] #${attempt} DELETE /domains/${name}`);
}
if (res.status === 403) {
return bail(new Error('Unauthorized'));
}
if (res.status !== 200) {
const body = await res.json();
throw new Error(body.error.message);
}
});
}
async add(domain, skipVerification, isExternal) {
if (!domainRegex.test(domain)) {
const err = new Error(
`The supplied value ${chalk.bold(`"${domain}"`)} is not a valid domain.`
);
err.userError = true;
throw err;
}
if (skipVerification || isExternal) {
return this.setupDomain(domain, { isExternal });
}
let ns;
try {
console.log('> Verifying nameservers…');
const res = await this.getNameservers(domain);
ns = res.nameservers;
} catch (err) {
const err2 = new Error(
`Unable to fetch nameservers for ${chalk.underline(chalk.bold(domain))}.`
);
err2.userError = true;
throw err2;
}
if (isZeitWorld(ns)) {
console.log(`> Verification ${chalk.bold('OK')}!`);
return this.setupDomain(domain);
}
if (this._debug) {
console.log(
`> [debug] Supplied domain "${domain}" has non-zeit nameservers`
);
}
const err3 = new Error(DNS_VERIFICATION_ERROR);
err3.userError = true;
throw err3;
}
};