From 9eda0da9a700fd21458eb63a25a48e3e2d3b1f33 Mon Sep 17 00:00:00 2001 From: Phil Kunz Date: Sun, 12 Aug 2018 00:29:02 +0200 Subject: [PATCH] feat(swaitch to acme-v2): switch to letsencrypt v2 --- dist/index.d.ts | 1 - dist/index.js | 7 - dist/smartacme.classes.acmeaccount.d.ts | 21 - dist/smartacme.classes.acmeaccount.js | 72 -- dist/smartacme.classes.acmecert.d.ts | 78 -- dist/smartacme.classes.acmecert.js | 183 --- dist/smartacme.classes.smartacme.d.ts | 32 - dist/smartacme.classes.smartacme.js | 67 -- dist/smartacme.helpers.d.ts | 10 - dist/smartacme.helpers.js | 41 - dist/smartacme.paths.d.ts | 2 - dist/smartacme.paths.js | 8 - dist/smartacme.plugins.d.ts | 9 - dist/smartacme.plugins.js | 19 - package-lock.json | 1376 +++++++++++++++++++++++ package.json | 25 +- test/test.ts | 93 +- ts/smartacme.classes.acmeaccount.ts | 94 -- ts/smartacme.classes.acmecert.ts | 255 ----- ts/smartacme.classes.keypair.ts | 27 + ts/smartacme.classes.smartacme.ts | 105 +- ts/smartacme.helpers.ts | 50 - ts/smartacme.paths.ts | 6 - ts/smartacme.plugins.ts | 23 +- 24 files changed, 1460 insertions(+), 1144 deletions(-) delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/smartacme.classes.acmeaccount.d.ts delete mode 100644 dist/smartacme.classes.acmeaccount.js delete mode 100644 dist/smartacme.classes.acmecert.d.ts delete mode 100644 dist/smartacme.classes.acmecert.js delete mode 100644 dist/smartacme.classes.smartacme.d.ts delete mode 100644 dist/smartacme.classes.smartacme.js delete mode 100644 dist/smartacme.helpers.d.ts delete mode 100644 dist/smartacme.helpers.js delete mode 100644 dist/smartacme.paths.d.ts delete mode 100644 dist/smartacme.paths.js delete mode 100644 dist/smartacme.plugins.d.ts delete mode 100644 dist/smartacme.plugins.js create mode 100644 package-lock.json delete mode 100644 ts/smartacme.classes.acmeaccount.ts delete mode 100644 ts/smartacme.classes.acmecert.ts create mode 100644 ts/smartacme.classes.keypair.ts delete mode 100644 ts/smartacme.helpers.ts delete mode 100644 ts/smartacme.paths.ts diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index 7c69782..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './smartacme.classes.smartacme'; diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index 3252a3a..0000000 --- a/dist/index.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict"; -function __export(m) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} -Object.defineProperty(exports, "__esModule", { value: true }); -__export(require("./smartacme.classes.smartacme")); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1EQUE2QyJ9 \ No newline at end of file diff --git a/dist/smartacme.classes.acmeaccount.d.ts b/dist/smartacme.classes.acmeaccount.d.ts deleted file mode 100644 index 5a2ad25..0000000 --- a/dist/smartacme.classes.acmeaccount.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { SmartAcme } from './smartacme.classes.smartacme'; -import { AcmeCert } from './smartacme.classes.acmecert'; -/** - * class AcmeAccount represents an AcmeAccount - */ -export declare class AcmeAccount { - parentSmartAcme: SmartAcme; - location: string; - link: string; - JWK: any; - constructor(smartAcmeParentArg: SmartAcme); - /** - * register the account with letsencrypt - */ - register(): Promise<{}>; - /** - * agree to letsencrypr terms of service - */ - agreeTos(): Promise<{}>; - createAcmeCert(domainNameArg: string, countryArg?: string, countryShortArg?: string, city?: string, companyArg?: string, companyShortArg?: string): Promise; -} diff --git a/dist/smartacme.classes.acmeaccount.js b/dist/smartacme.classes.acmeaccount.js deleted file mode 100644 index a539064..0000000 --- a/dist/smartacme.classes.acmeaccount.js +++ /dev/null @@ -1,72 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const q = require("smartq"); -const smartacme_classes_acmecert_1 = require("./smartacme.classes.acmecert"); -/** - * class AcmeAccount represents an AcmeAccount - */ -class AcmeAccount { - constructor(smartAcmeParentArg) { - this.parentSmartAcme = smartAcmeParentArg; - } - /** - * register the account with letsencrypt - */ - register() { - let done = q.defer(); - this.parentSmartAcme.rawacmeClient.newReg({ - contact: ['mailto:domains@lossless.org'] - }, (err, res) => { - if (err) { - console.error('smartacme: something went wrong:'); - console.log(err); - done.reject(err); - return; - } - this.JWK = res.body.key; - this.link = res.headers.link; - console.log(this.link); - this.location = res.headers.location; - done.resolve(); - }); - return done.promise; - } - /** - * agree to letsencrypr terms of service - */ - agreeTos() { - let done = q.defer(); - let tosPart = this.link.split(',')[1]; - let tosLinkPortion = tosPart.split(';')[0]; - let url = tosLinkPortion.split(';')[0].trim().replace(/[<>]/g, ''); - this.parentSmartAcme.rawacmeClient.post(this.location, { Agreement: url, resource: 'reg' }, (err, res) => { - if (err) { - console.log(err); - done.reject(err); - return; - } - done.resolve(); - }); - return done.promise; - } - createAcmeCert(domainNameArg, countryArg = 'Germany', countryShortArg = 'DE', city = 'Bremen', companyArg = 'Some Company', companyShortArg = 'SC') { - let done = q.defer(); - let acmeCert = new smartacme_classes_acmecert_1.AcmeCert({ - bit: 2064, - key: null, - domain: domainNameArg, - country: countryArg, - country_short: countryShortArg, - locality: city, - organization: companyArg, - organization_short: companyShortArg, - password: null, - unstructured: null, - subject_alt_names: null - }, this); - done.resolve(acmeCert); - return done.promise; - } -} -exports.AcmeAccount = AcmeAccount; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuYWNtZWFjY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFjbWUuY2xhc3Nlcy5hY21lYWNjb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDRCQUEyQjtBQU0zQiw2RUFBdUQ7QUFFdkQ7O0dBRUc7QUFDSDtJQUtFLFlBQVksa0JBQTZCO1FBQ3ZDLElBQUksQ0FBQyxlQUFlLEdBQUcsa0JBQWtCLENBQUE7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNwQixJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQ3ZDO1lBQ0UsT0FBTyxFQUFFLENBQUUsNkJBQTZCLENBQUU7U0FDM0MsRUFDRCxDQUFDLEdBQUcsRUFBRSxHQUFHO1lBQ1AsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDUixPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUE7Z0JBQ2pELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2hCLE1BQU0sQ0FBQTtZQUNSLENBQUM7WUFDRCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFBO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUE7WUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQTtZQUNwQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDaEIsQ0FBQyxDQUFDLENBQUE7UUFDSixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRO1FBQ04sSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3BCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFFLENBQUMsQ0FBRSxDQUFBO1FBQ3ZDLElBQUksY0FBYyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUUsQ0FBQyxDQUFFLENBQUE7UUFDNUMsSUFBSSxHQUFHLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBRSxDQUFDLENBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ3BFLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRztZQUNuRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNSLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2hCLE1BQU0sQ0FBQTtZQUNSLENBQUM7WUFDRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDaEIsQ0FBQyxDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUNyQixDQUFDO0lBRUQsY0FBYyxDQUNaLGFBQXFCLEVBQ3JCLFVBQVUsR0FBRyxTQUFTLEVBQ3RCLGVBQWUsR0FBRyxJQUFJLEVBQ3RCLElBQUksR0FBRyxRQUFRLEVBQ2YsVUFBVSxHQUFHLGNBQWMsRUFDM0IsZUFBZSxHQUFHLElBQUk7UUFHdEIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBWSxDQUFBO1FBQzlCLElBQUksUUFBUSxHQUFHLElBQUkscUNBQVEsQ0FDekI7WUFDRSxHQUFHLEVBQUUsSUFBSTtZQUNULEdBQUcsRUFBRSxJQUFJO1lBQ1QsTUFBTSxFQUFFLGFBQWE7WUFDckIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsYUFBYSxFQUFFLGVBQWU7WUFDOUIsUUFBUSxFQUFFLElBQUk7WUFDZCxZQUFZLEVBQUUsVUFBVTtZQUN4QixrQkFBa0IsRUFBRSxlQUFlO1lBQ25DLFFBQVEsRUFBRSxJQUFJO1lBQ2QsWUFBWSxFQUFFLElBQUk7WUFDbEIsaUJBQWlCLEVBQUUsSUFBSTtTQUN4QixFQUNELElBQUksQ0FDTCxDQUFBO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUNyQixDQUFDO0NBQ0Y7QUFsRkQsa0NBa0ZDIn0= \ No newline at end of file diff --git a/dist/smartacme.classes.acmecert.d.ts b/dist/smartacme.classes.acmecert.d.ts deleted file mode 100644 index 02ee490..0000000 --- a/dist/smartacme.classes.acmecert.d.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { IRsaKeypair } from './smartacme.classes.smartacme'; -import { AcmeAccount } from './smartacme.classes.acmeaccount'; -/** - * types of challenges supported by letsencrypt and this module - */ -export declare type TChallengeType = 'dns-01' | 'http-01'; -/** - * values that a challenge's status can have - */ -export declare type TChallengeStatus = 'pending'; -export interface ISmartAcmeChallenge { - uri: string; - status: TChallengeStatus; - type: TChallengeType; - token: string; - keyAuthorization: string; -} -export interface ISmartAcmeChallengeChosen extends ISmartAcmeChallenge { - dnsKeyHash: string; - domainName: string; - domainNamePrefixed: string; -} -export interface IAcmeCsrConstructorOptions { - bit: number; - key: string; - domain: string; - country: string; - country_short: string; - locality: string; - organization: string; - organization_short: string; - password: string; - unstructured: string; - subject_alt_names: string[]; -} -/** - * class AcmeCert represents a cert for domain - */ -export declare class AcmeCert { - domainName: string; - attributes: any; - fullchain: string; - parentAcmeAccount: AcmeAccount; - csr: any; - validFrom: Date; - validTo: Date; - keypair: IRsaKeypair; - keyPairFinal: IRsaKeypair; - chosenChallenge: ISmartAcmeChallengeChosen; - dnsKeyHash: string; - constructor(optionsArg: IAcmeCsrConstructorOptions, parentAcmeAccount: AcmeAccount); - /** - * requests a challenge for a domain - * @param domainNameArg - the domain name to request a challenge for - * @param challengeType - the challenge type to request - */ - requestChallenge(challengeTypeArg?: TChallengeType): Promise; - /** - * checks if DNS records are set, will go through a max of 30 cycles - */ - checkDns(cycleArg?: number): Promise; - /** - * validates a challenge, only call after you have set the challenge at the expected location - */ - requestValidation(): Promise; - /** - * requests a certificate - */ - requestCert(): Promise<{}>; - /** - * getCertificate - takes care of cooldown, validation polling and certificate retrieval - */ - getCertificate(): void; - /** - * accept a challenge - for private use only - */ - acceptChallenge(): Promise<{}>; -} diff --git a/dist/smartacme.classes.acmecert.js b/dist/smartacme.classes.acmecert.js deleted file mode 100644 index 2749eca..0000000 --- a/dist/smartacme.classes.acmecert.js +++ /dev/null @@ -1,183 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const q = require("smartq"); -const plugins = require("./smartacme.plugins"); -const helpers = require("./smartacme.helpers"); -// Dnsly instance (we really just need one) -let myDnsly = new plugins.dnsly.Dnsly('google'); -/** - * class AcmeCert represents a cert for domain - */ -class AcmeCert { - constructor(optionsArg, parentAcmeAccount) { - this.domainName = optionsArg.domain; - this.parentAcmeAccount = parentAcmeAccount; - this.keypair = helpers.createKeypair(optionsArg.bit); - let privateKeyForged = plugins.nodeForge.pki.privateKeyFromPem(this.keypair.privateKey); - let publicKeyForged = plugins.nodeForge.pki.publicKeyToPem(plugins.nodeForge.pki.setRsaPublicKey(privateKeyForged.n, privateKeyForged.e)); - this.keyPairFinal = { - privateKey: privateKeyForged, - publicKey: publicKeyForged - }; - // set dates - this.validFrom = new Date(); - this.validTo = new Date(); - this.validTo.setDate(this.validFrom.getDate() + 90); - // set attributes - this.attributes = [ - { name: 'commonName', value: optionsArg.domain }, - { name: 'countryName', value: optionsArg.country }, - { shortName: 'ST', value: optionsArg.country_short }, - { name: 'localityName', value: optionsArg.locality }, - { name: 'organizationName', value: optionsArg.organization }, - { shortName: 'OU', value: optionsArg.organization_short }, - { name: 'challengePassword', value: optionsArg.password }, - { name: 'unstructuredName', value: optionsArg.unstructured } - ]; - // set up csr - this.csr = plugins.nodeForge.pki.createCertificationRequest(); - this.csr.setSubject(this.attributes); - this.csr.setAttributes(this.attributes); - } - /** - * requests a challenge for a domain - * @param domainNameArg - the domain name to request a challenge for - * @param challengeType - the challenge type to request - */ - requestChallenge(challengeTypeArg = 'dns-01') { - let done = q.defer(); - this.parentAcmeAccount.parentSmartAcme.rawacmeClient.newAuthz({ - identifier: { - type: 'dns', - value: this.domainName - } - }, this.parentAcmeAccount.parentSmartAcme.keyPair, (err, res) => { - if (err) { - console.error('smartacme: something went wrong:'); - console.log(err); - done.reject(err); - } - let preChosenChallenge = res.body.challenges.filter(x => { - return x.type === challengeTypeArg; - })[0]; - /** - * the key is needed to accept the challenge - */ - let authKey = plugins.rawacme.keyAuthz(preChosenChallenge.token, this.parentAcmeAccount.parentSmartAcme.keyPair.publicKey); - /** - * needed in case selected challenge is of type dns-01 - */ - this.dnsKeyHash = plugins.rawacme.dnsKeyAuthzHash(authKey); // needed if dns challenge is chosen - /** - * the return challenge - */ - this.chosenChallenge = { - uri: preChosenChallenge.uri, - type: preChosenChallenge.type, - token: preChosenChallenge.token, - keyAuthorization: authKey, - status: preChosenChallenge.status, - dnsKeyHash: this.dnsKeyHash, - domainName: this.domainName, - domainNamePrefixed: helpers.prefixName(this.domainName) - }; - done.resolve(this.chosenChallenge); - }); - return done.promise; - } - /** - * checks if DNS records are set, will go through a max of 30 cycles - */ - checkDns(cycleArg = 1) { - return __awaiter(this, void 0, void 0, function* () { - let result = yield myDnsly.checkUntilAvailable(helpers.prefixName(this.domainName), 'TXT', this.dnsKeyHash); - if (result) { - console.log('DNS is set!'); - return; - } - else { - throw new Error('DNS not set!'); - } - }); - } - /** - * validates a challenge, only call after you have set the challenge at the expected location - */ - requestValidation() { - return __awaiter(this, void 0, void 0, function* () { - let makeRequest = () => { - let done = q.defer(); - this.parentAcmeAccount.parentSmartAcme.rawacmeClient.poll(this.chosenChallenge.uri, (err, res) => __awaiter(this, void 0, void 0, function* () { - if (err) { - console.log(err); - return; - } - console.log(`Validation response:`); - console.log(JSON.stringify(res.body)); - if (res.body.status === 'pending' || res.body.status === 'invalid') { - yield plugins.smartdelay.delayFor(3000); - makeRequest().then((x) => { done.resolve(x); }); - } - else { - console.log('perfect!'); - done.resolve(res.body); - } - })); - return done.promise; - }; - yield makeRequest(); - }); - } - /** - * requests a certificate - */ - requestCert() { - let done = q.defer(); - let payload = { - csr: plugins.rawacme.base64.encode(plugins.rawacme.toDer(plugins.nodeForge.pki.certificationRequestToPem(this.csr))), - notBefore: this.validFrom.toISOString(), - notAfter: this.validTo.toISOString() - }; - this.parentAcmeAccount.parentSmartAcme.rawacmeClient.newCert(payload, helpers.createKeypair(), (err, res) => { - if (err) { - console.log(err); - done.reject(err); - } - console.log(res.body); - done.resolve(res.body); - }); - return done.promise; - } - /** - * getCertificate - takes care of cooldown, validation polling and certificate retrieval - */ - getCertificate() { - } - /** - * accept a challenge - for private use only - */ - acceptChallenge() { - let done = q.defer(); - this.parentAcmeAccount.parentSmartAcme.rawacmeClient.post(this.chosenChallenge.uri, { - resource: 'challenge', - keyAuthorization: this.chosenChallenge.keyAuthorization - }, this.parentAcmeAccount.parentSmartAcme.keyPair, (err, res) => { - if (err) { - console.log(err); - done.reject(err); - } - done.resolve(res.body); - }); - return done.promise; - } -} -exports.AcmeCert = AcmeCert; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuYWNtZWNlcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFjbWUuY2xhc3Nlcy5hY21lY2VydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsNEJBQTJCO0FBRTNCLCtDQUE4QztBQUM5QywrQ0FBOEM7QUEyQzlDLDJDQUEyQztBQUMzQyxJQUFJLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBRS9DOztHQUVHO0FBQ0g7SUFZRSxZQUFZLFVBQXNDLEVBQUUsaUJBQThCO1FBQ2hGLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQTtRQUNuQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUE7UUFDMUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNwRCxJQUFJLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDdkYsSUFBSSxlQUFlLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUN4RCxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUM5RSxDQUFBO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRztZQUNsQixVQUFVLEVBQUUsZ0JBQWdCO1lBQzVCLFNBQVMsRUFBRSxlQUFlO1NBQzNCLENBQUE7UUFFRCxZQUFZO1FBQ1osSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1FBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxJ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 \ No newline at end of file diff --git a/dist/smartacme.classes.smartacme.d.ts b/dist/smartacme.classes.smartacme.d.ts deleted file mode 100644 index 201f8c6..0000000 --- a/dist/smartacme.classes.smartacme.d.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { AcmeAccount } from './smartacme.classes.acmeaccount'; -/** - * a rsa keypair needed for account creation and subsequent requests - */ -export interface IRsaKeypair { - publicKey: string; - privateKey: string; -} -export { AcmeAccount } from './smartacme.classes.acmeaccount'; -export { AcmeCert, ISmartAcmeChallenge, ISmartAcmeChallengeChosen } from './smartacme.classes.acmecert'; -/** - * class SmartAcme exports methods for maintaining SSL Certificates - */ -export declare class SmartAcme { - acmeUrl: string; - productionBool: boolean; - keyPair: IRsaKeypair; - rawacmeClient: any; - /** - * the constructor for class SmartAcme - */ - constructor(productionArg?: boolean); - /** - * init the smartacme instance - */ - init(): Promise<{}>; - /** - * creates an account if not currently present in module - * @executes ASYNC - */ - createAcmeAccount(): Promise; -} diff --git a/dist/smartacme.classes.smartacme.js b/dist/smartacme.classes.smartacme.js deleted file mode 100644 index 8427bee..0000000 --- a/dist/smartacme.classes.smartacme.js +++ /dev/null @@ -1,67 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -// third party modules -const q = require("smartq"); // promises -const plugins = require("./smartacme.plugins"); -const helpers = require("./smartacme.helpers"); -const smartacme_classes_acmeaccount_1 = require("./smartacme.classes.acmeaccount"); -var smartacme_classes_acmeaccount_2 = require("./smartacme.classes.acmeaccount"); -exports.AcmeAccount = smartacme_classes_acmeaccount_2.AcmeAccount; -var smartacme_classes_acmecert_1 = require("./smartacme.classes.acmecert"); -exports.AcmeCert = smartacme_classes_acmecert_1.AcmeCert; -/** - * class SmartAcme exports methods for maintaining SSL Certificates - */ -class SmartAcme { - /** - * the constructor for class SmartAcme - */ - constructor(productionArg = false) { - this.productionBool = productionArg; - this.keyPair = helpers.createKeypair(); - if (this.productionBool) { - this.acmeUrl = plugins.rawacme.LETSENCRYPT_URL; - } - else { - this.acmeUrl = plugins.rawacme.LETSENCRYPT_STAGING_URL; - } - } - /** - * init the smartacme instance - */ - init() { - let done = q.defer(); - plugins.rawacme.createClient({ - url: this.acmeUrl, - publicKey: this.keyPair.publicKey, - privateKey: this.keyPair.privateKey - }, (err, client) => { - if (err) { - console.error('smartacme: something went wrong:'); - console.log(err); - done.reject(err); - return; - } - // make client available in class - this.rawacmeClient = client; - done.resolve(); - }); - return done.promise; - } - /** - * creates an account if not currently present in module - * @executes ASYNC - */ - createAcmeAccount() { - let done = q.defer(); - let acmeAccount = new smartacme_classes_acmeaccount_1.AcmeAccount(this); - acmeAccount.register().then(() => { - return acmeAccount.agreeTos(); - }).then(() => { - done.resolve(acmeAccount); - }); - return done.promise; - } -} -exports.SmartAcme = SmartAcme; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuc21hcnRhY21lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhY21lLmNsYXNzZXMuc21hcnRhY21lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0JBQXNCO0FBQ3RCLDRCQUEyQixDQUFDLFdBQVc7QUFDdkMsK0NBQThDO0FBQzlDLCtDQUE4QztBQUU5QyxtRkFBNkQ7QUFVN0QsaUZBQTZEO0FBQXBELHNEQUFBLFdBQVcsQ0FBQTtBQUNwQiwyRUFBdUc7QUFBOUYsZ0RBQUEsUUFBUSxDQUFBO0FBRWpCOztHQUVHO0FBQ0g7SUFNRTs7T0FFRztJQUNILFlBQVksZ0JBQXlCLEtBQUs7UUFDeEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUE7UUFDbkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDdEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQTtRQUNoRCxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUE7UUFDeEQsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILElBQUk7UUFDRixJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDcEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQzFCO1lBQ0UsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ2pCLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVM7WUFDakMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtTQUNwQyxFQUNELENBQUMsR0FBRyxFQUFFLE1BQU07WUFDVixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtnQkFDakQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDaEIsTUFBTSxDQUFBO1lBQ1IsQ0FBQztZQUVELGtDQUFrQztZQUNsQyxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQTtZQUMzQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDaEIsQ0FBQyxDQUNGLENBQUE7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsaUJBQWlCO1FBQ2YsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBZSxDQUFBO1FBQ2pDLElBQUksV0FBVyxHQUFHLElBQUksMkNBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN2QyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUE7UUFDL0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ04sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUMzQixDQUFDLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3JCLENBQUM7Q0FDRjtBQTVERCw4QkE0REMifQ== \ No newline at end of file diff --git a/dist/smartacme.helpers.d.ts b/dist/smartacme.helpers.d.ts deleted file mode 100644 index f661860..0000000 --- a/dist/smartacme.helpers.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import 'typings-global'; -import { IRsaKeypair } from './smartacme.classes.smartacme'; -/** - * creates a keypair to use with requests and to generate JWK from - */ -export declare let createKeypair: (bit?: number) => IRsaKeypair; -/** - * prefix a domain name to make sure it complies with letsencrypt - */ -export declare let prefixName: (domainNameArg: string) => string; diff --git a/dist/smartacme.helpers.js b/dist/smartacme.helpers.js deleted file mode 100644 index 7096ecf..0000000 --- a/dist/smartacme.helpers.js +++ /dev/null @@ -1,41 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -require("typings-global"); -const q = require("smartq"); -const plugins = require("./smartacme.plugins"); -/** - * creates a keypair to use with requests and to generate JWK from - */ -exports.createKeypair = (bit = 2048) => { - let result = plugins.rsaKeygen.generate(bit); - return { - publicKey: result.public_key, - privateKey: result.private_key - }; -}; -/** - * prefix a domain name to make sure it complies with letsencrypt - */ -exports.prefixName = (domainNameArg) => { - return '_acme-challenge.' + domainNameArg; -}; -/** - * gets an existing registration - * @executes ASYNC - */ -let getReg = (SmartAcmeArg, location) => { - let done = q.defer(); - let body = { resource: 'reg' }; - SmartAcmeArg.rawacmeClient.post(location, body, SmartAcmeArg.keyPair, (err, res) => { - if (err) { - console.error('smartacme: something went wrong:'); - console.log(err); - done.reject(err); - return; - } - console.log(JSON.stringify(res.body)); - done.resolve(); - }); - return done.promise; -}; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFjbWUuaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBCQUF1QjtBQUN2Qiw0QkFBMkI7QUFFM0IsK0NBQThDO0FBSzlDOztHQUVHO0FBQ1EsUUFBQSxhQUFhLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSTtJQUNwQyxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUM1QyxNQUFNLENBQUM7UUFDTCxTQUFTLEVBQUUsTUFBTSxDQUFDLFVBQVU7UUFDNUIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxXQUFXO0tBQy9CLENBQUE7QUFDSCxDQUFDLENBQUE7QUFFRDs7R0FFRztBQUNRLFFBQUEsVUFBVSxHQUFHLENBQUMsYUFBcUI7SUFDNUMsTUFBTSxDQUFDLGtCQUFrQixHQUFHLGFBQWEsQ0FBQTtBQUMzQyxDQUFDLENBQUE7QUFFRDs7O0dBR0c7QUFDSCxJQUFJLE1BQU0sR0FBRyxDQUFDLFlBQXVCLEVBQUUsUUFBZ0I7SUFDckQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ3BCLElBQUksSUFBSSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFBO0lBQzlCLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUM3QixRQUFRLEVBQ1IsSUFBSSxFQUNKLFlBQVksQ0FBQyxPQUFPLEVBQ3BCLENBQUMsR0FBRyxFQUFFLEdBQUc7UUFDUCxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFBO1lBQ2pELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNoQixNQUFNLENBQUE7UUFDUixDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNoQixDQUFDLENBQ0YsQ0FBQTtJQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0FBQ3JCLENBQUMsQ0FBQSJ9 \ No newline at end of file diff --git a/dist/smartacme.paths.d.ts b/dist/smartacme.paths.d.ts deleted file mode 100644 index 06164dd..0000000 --- a/dist/smartacme.paths.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export declare let packageDir: string; -export declare let assetDir: string; diff --git a/dist/smartacme.paths.js b/dist/smartacme.paths.js deleted file mode 100644 index 9c35dda..0000000 --- a/dist/smartacme.paths.js +++ /dev/null @@ -1,8 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const path = require("path"); -const smartfile = require("smartfile"); -exports.packageDir = path.join(__dirname, '../'); -exports.assetDir = path.join(exports.packageDir, 'assets/'); -smartfile.fs.ensureDirSync(exports.assetDir); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLnBhdGhzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhY21lLnBhdGhzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQTRCO0FBQzVCLHVDQUFzQztBQUUzQixRQUFBLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBQyxLQUFLLENBQUMsQ0FBQTtBQUN2QyxRQUFBLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFVLEVBQUMsU0FBUyxDQUFDLENBQUE7QUFDckQsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsZ0JBQVEsQ0FBQyxDQUFBIn0= \ No newline at end of file diff --git a/dist/smartacme.plugins.d.ts b/dist/smartacme.plugins.d.ts deleted file mode 100644 index d19f4e3..0000000 --- a/dist/smartacme.plugins.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import 'typings-global'; -declare let rsaKeygen: any; -declare let rawacme: any; -declare let nodeForge: any; -import * as dnsly from 'dnsly'; -import * as smartdelay from 'smartdelay'; -import * as smartfile from 'smartfile'; -import * as smartstring from 'smartstring'; -export { dnsly, rsaKeygen, rawacme, nodeForge, smartdelay, smartfile, smartstring }; diff --git a/dist/smartacme.plugins.js b/dist/smartacme.plugins.js deleted file mode 100644 index f94170f..0000000 --- a/dist/smartacme.plugins.js +++ /dev/null @@ -1,19 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -require("typings-global"); // typings for node -let rsaKeygen = require('rsa-keygen'); // rsa keygen -exports.rsaKeygen = rsaKeygen; -let rawacme = require('rawacme'); // acme helper functions -exports.rawacme = rawacme; -let nodeForge = require('node-forge'); -exports.nodeForge = nodeForge; -// push.rocks modules here -const dnsly = require("dnsly"); -exports.dnsly = dnsly; -const smartdelay = require("smartdelay"); -exports.smartdelay = smartdelay; -const smartfile = require("smartfile"); -exports.smartfile = smartfile; -const smartstring = require("smartstring"); -exports.smartstring = smartstring; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFjbWUucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBCQUF1QixDQUFDLG1CQUFtQjtBQUczQyxJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUEsQ0FBQyxhQUFhO0FBWWpELDhCQUFTO0FBWFgsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBLENBQUMsd0JBQXdCO0FBWXZELDBCQUFPO0FBWFQsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFBO0FBWW5DLDhCQUFTO0FBVlgsMEJBQTBCO0FBQzFCLCtCQUE4QjtBQU01QixzQkFBSztBQUxQLHlDQUF3QztBQVN0QyxnQ0FBVTtBQVJaLHVDQUFzQztBQVNwQyw4QkFBUztBQVJYLDJDQUEwQztBQVN4QyxrQ0FBVyJ9 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..75904c4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1376 @@ +{ + "name": "smartacme", + "version": "1.0.11", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@airbnb/node-memwatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@airbnb/node-memwatch/-/node-memwatch-1.0.2.tgz", + "integrity": "sha512-2R+MEEMSTUdKwQ6NFWkyA/UNoSjL1tMldZqJbZpgXSwNMBzlNlkUWEXKu9RqTTMkDqJRfGJ2VDs8gPlPK2APDQ==", + "dev": true, + "requires": { + "bindings": "^1.3.0", + "nan": "^2.9.2" + } + }, + "@coolaj86/urequest": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@coolaj86/urequest/-/urequest-1.3.6.tgz", + "integrity": "sha512-9rBXLFSb5D19opGeXdD/WuiFJsA4Pk2r8VUGEAeUZUxB1a2zB47K85BKAx3Gy9i4nZwg22ejlJA+q9DVrpQlbA==" + }, + "@gitzone/tsbuild": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@gitzone/tsbuild/-/tsbuild-2.0.22.tgz", + "integrity": "sha512-H0rqGVUKXWgxXhkY62kF92WpbS9GSJW27jQXaoyMsQptTQN4HIYKHWZMdO4egkk0/gDmKnBjk8MXg5Rx6efItA==", + "dev": true, + "requires": { + "@pushrocks/smartfile": "^6.0.6", + "@pushrocks/smartlog": "^2.0.1", + "@pushrocks/smartpath": "^4.0.1", + "@pushrocks/smartpromise": "^2.0.5", + "typescript": "^3.0.1" + } + }, + "@gitzone/tsrun": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@gitzone/tsrun/-/tsrun-1.1.12.tgz", + "integrity": "sha512-DOxqOg+evoxhgbzhzH4u6LaPF+6bpMsnBVl1QQaHzKPGBlNjaIY4yJ0RsGnWMgX1hlNLvbgHtl0Ky4A2MDvyrg==", + "dev": true, + "requires": { + "@gitzone/tsbuild": "^2.0.22", + "@pushrocks/smartfile": "^6.0.6", + "ts-node": "^7.0.0", + "typescript": "^3.0.1" + } + }, + "@gitzone/tstest": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@gitzone/tstest/-/tstest-1.0.13.tgz", + "integrity": "sha512-nEdT3YJHrpkUVpum75n/ZU5voCjd7Fvq8gqbf47oaPC6r2LbqUhc6PnKo/YYaQLgXAaBtCTxFLZMUlWDg5fguw==", + "dev": true, + "requires": { + "@gitzone/tsrun": "^1.1.11", + "@pushrocks/consolecolor": "^2.0.1", + "@pushrocks/smartfile": "^6.0.6", + "@pushrocks/smartlog": "^2.0.1", + "@pushrocks/smartpromise": "^2.0.5", + "@pushrocks/smartshell": "^2.0.6", + "@types/figures": "^2.0.0", + "figures": "^2.0.0" + } + }, + "@pushrocks/consolecolor": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@pushrocks/consolecolor/-/consolecolor-2.0.1.tgz", + "integrity": "sha512-iOFCHVeFZ2OywbdwSxVI4/wokkcLrXVdHLgvMmkNhJ220eeLgjNZWx3EJo3vNW3zq5ybCSCUIq0878djBxrWpw==", + "dev": true, + "requires": { + "ansi-256-colors": "^1.1.0" + } + }, + "@pushrocks/smartfile": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/@pushrocks/smartfile/-/smartfile-6.0.6.tgz", + "integrity": "sha512-vA1+yS6n0kuBZ+Bl30rxOCYvgIj0mo9g303cUpOZR0I781iQVWHcBKRC05FaGDxJD1HuYdvbSK+7vlrzZjVcMw==", + "dev": true, + "requires": { + "@pushrocks/smartpath": "^4.0.1", + "@pushrocks/smartpromise": "^2.0.5", + "@pushrocks/smartrequest": "^1.1.12", + "@types/fs-extra": "^5.0.4", + "@types/vinyl": "^2.0.2", + "fs-extra": "^7.0.0", + "glob": "^7.1.2", + "js-yaml": "^3.10.0", + "vinyl-file": "^3.0.0" + } + }, + "@pushrocks/smartlog": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@pushrocks/smartlog/-/smartlog-2.0.1.tgz", + "integrity": "sha512-GtsDTGIUF3VuWPyF8FV5dF31ZCEIcaJ56ZlvJsWxjnyJq57X25mk5/K0QAaRE9IIeHg6fORcukFomb5C+AOQrg==", + "dev": true, + "requires": { + "@pushrocks/smartlog-interfaces": "^1.0.9" + } + }, + "@pushrocks/smartlog-interfaces": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@pushrocks/smartlog-interfaces/-/smartlog-interfaces-1.0.9.tgz", + "integrity": "sha512-0qwpomrRN0kFjmhR9m1iHYXoISoNuXtRP0Wr+JtkYyURLwKHMaW8Xoznf8MzXJptRfqufJi3Fxh5HodpPrIZUA==", + "dev": true + }, + "@pushrocks/smartpath": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@pushrocks/smartpath/-/smartpath-4.0.1.tgz", + "integrity": "sha512-MaI0+uLQPCr2V3WGnbdgb0pWa9xkWyrP4qYcbsHIjeismGLbn9s3jmP/HIXU8LkgzRgaVb+BJxmZJHOwl32DyA==", + "dev": true + }, + "@pushrocks/smartpromise": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@pushrocks/smartpromise/-/smartpromise-2.0.5.tgz", + "integrity": "sha512-9j/chLtIiNkR0MDw7Mpxg9slxAVvAQwUZuiaPYX5KpHdKxQaHLI1VZ8IN0vPhwlfgNO4i4vGXV0wB8BvSDj03g==" + }, + "@pushrocks/smartrequest": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@pushrocks/smartrequest/-/smartrequest-1.1.12.tgz", + "integrity": "sha512-8vDpYUADkbJFdxDcHQJyJBpc66+cvsRAJdQ6SwMirz5cIeWNlLSR/PVrdGQ94z5tSusf4mwnODk2Ai9smN6XSA==", + "dev": true, + "requires": { + "@pushrocks/smartpromise": "^2.0.5", + "@types/form-data": "^2.2.1", + "form-data": "^2.3.2" + } + }, + "@pushrocks/smartshell": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@pushrocks/smartshell/-/smartshell-2.0.6.tgz", + "integrity": "sha512-D48KB3DDqLfMjOXGEutqJi+v3Z4RcWacu5BJXxUwrecvd6oetbKobfmNGxeHSQPmNGb7U3ISfKwV6c5T5EZkJg==", + "dev": true, + "requires": { + "@pushrocks/smartpromise": "^2.0.5", + "@types/which": "^1.3.1", + "which": "^1.3.1" + } + }, + "@types/chai": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.4.tgz", + "integrity": "sha512-h6+VEw2Vr3ORiFCyyJmcho2zALnUq9cvdB/IO8Xs9itrJVCenC7o26A6+m7D0ihTTr65eS259H5/Ghl/VjYs6g==", + "dev": true + }, + "@types/chai-as-promised": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.0.tgz", + "integrity": "sha512-MFiW54UOSt+f2bRw8J7LgQeIvE/9b4oGvwU7XW30S9QGAiHGnU/fmiOprsyMkdmH2rl8xSPc0/yrQw8juXU6bQ==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, + "@types/chai-string": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@types/chai-string/-/chai-string-1.4.1.tgz", + "integrity": "sha512-aRNMs6TKgjgPlCHwDfq/YNy5VtRR2hJ4AUWByddrT0TRVVD8eX4MiHW6/iHvmQHRlVuuPZcwnTUE7b4yFt7bEA==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, + "@types/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-mcRgJ+ncKuNI+Dwac7omO18B8C8u+YBS+AU/oyLhEyjAnT3cUUThhHgZpbiIvu5ZqSvdD30BXtrqg9nxc3OKMg==", + "dev": true + }, + "@types/form-data": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz", + "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/fs-extra": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.4.tgz", + "integrity": "sha512-DsknoBvD8s+RFfSGjmERJ7ZOP1HI0UZRA3FSI+Zakhrc/Gy26YQsLI+m5V5DHxroHRJqCDLKJp7Hixn8zyaF7g==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/lodash": { + "version": "4.14.116", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.116.tgz", + "integrity": "sha512-lRnAtKnxMXcYYXqOiotTmJd74uawNWuPnsnPrrO7HiFuE3npE2iQhfABatbYDyxTNqZNuXzcKGhw37R7RjBFLg==", + "dev": true + }, + "@types/node": { + "version": "10.5.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.8.tgz", + "integrity": "sha512-sWSjw+bYW/2W+1V3m8tVsm9PKJcxk3NHN7oRqNUfEdofKg0Imbdu1dQbFvLKjZQXEDXRN6IfSMACjJ7Wv4NGCQ==", + "dev": true + }, + "@types/vinyl": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.2.tgz", + "integrity": "sha512-2iYpNuOl98SrLPBZfEN9Mh2JCJ2EI9HU35SfgBEb51DcmaHkhp8cKMblYeBqMQiwXMgAD3W60DbQ4i/UdLiXhw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/which/-/which-1.3.1.tgz", + "integrity": "sha512-ZrJDWpvg75LTGX4XwuneY9s6bF3OeZcGTpoGh3zDV9ytzcHMFsRrMIaLBRJZQMBoGyKs6unBQfVdrLZiYfb1zQ==", + "dev": true + }, + "acme-v2": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/acme-v2/-/acme-v2-1.2.0.tgz", + "integrity": "sha512-3H86vhNJAc7x1TKk+6zfMNbxDSD20RsF3jM1Uf5x7NkgjU8nAwvzJ2W3kcyuivFKB8BntCcTIC8KtZKqF8eSBw==", + "requires": { + "@coolaj86/urequest": "^1.1.1", + "rsa-compat": "^1.3.0" + } + }, + "ansi-256-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-256-colors/-/ansi-256-colors-1.1.0.tgz", + "integrity": "sha1-kQ3lDvzHwJ49gvL4er1rcAwYgYo=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "beautycolor": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/beautycolor/-/beautycolor-1.0.11.tgz", + "integrity": "sha512-Uxl/39+2uqixPzsrV+0NOHf0sJlWmsKnRTV0oz8+bfwnHPA/E+SZuh3Upn3OXobv0W7LZg5BVoLj1nkMj7m5jA==", + "dev": true, + "requires": { + "ansi-256-colors": "^1.1.0", + "typings-global": "^1.0.14" + } + }, + "beautylog": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/beautylog/-/beautylog-6.1.10.tgz", + "integrity": "sha1-nCflZpN2hMton5Ny2Yz6VBXVC3I=", + "dev": true, + "requires": { + "@types/lodash": "^4.14.55", + "beautycolor": "^1.0.7", + "figlet": "^1.2.0", + "lodash": "^4.17.4", + "ora": "^1.1.0", + "smartenv": "^2.0.0", + "smartq": "^1.1.1", + "typings-global": "^1.0.14" + } + }, + "bindings": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", + "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "cflare": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/cflare/-/cflare-1.0.5.tgz", + "integrity": "sha1-0B/XhZ4UEvRcsp8CoiJ/8EcasJQ=", + "dev": true, + "requires": { + "beautylog": "^6.1.10", + "smartdelay": "^1.0.3", + "smartq": "^1.1.1", + "smartrequest": "^1.0.6", + "smartstring": "^2.0.24", + "tsclass": "^1.0.12", + "typings-global": "^1.0.17" + } + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" + } + }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "^1.0.2" + } + }, + "chai-string": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/chai-string/-/chai-string-1.4.0.tgz", + "integrity": "sha1-NZFAwFHTak5LGl/GuRAVL0OKjUk=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-spinners": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", + "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", + "dev": true + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "dev": true, + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "dev": true + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "early": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/early/-/early-2.1.1.tgz", + "integrity": "sha1-hB4jJU6l3FTYr67ugvWrZcAO4jw=", + "dev": true, + "requires": { + "beautycolor": "^1.0.7", + "smartq": "^1.1.1", + "typings-global": "^1.0.16" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "figlet": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.2.0.tgz", + "integrity": "sha1-bEZTc3j6tkkUa1phQ92gGbQwtBA=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", + "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "home": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/home/-/home-1.0.1.tgz", + "integrity": "sha1-lqQjzrSbmDeP9e886uBZpVf53TU=", + "dev": true, + "requires": { + "os-homedir": "^1.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-base64": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.8.tgz", + "integrity": "sha512-hm2nYpDrwoO/OzBhdcqs/XGT6XjSuSSCVEpia+Kl2J6x4CYt5hISlVL/AYU1khoDXv0AQVgxtdJySb9gjAn56Q==", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "leakage": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/leakage/-/leakage-0.4.0.tgz", + "integrity": "sha512-x7gYK5n5dPkHDZWJ2Kh8Ag1hZNzUh+HtXn8Bv1aDdN6o6ONPCJ8sOfFq+kxcULJFp3lXaCjXb3iXOLmQRbBLwA==", + "dev": true, + "requires": { + "@airbnb/node-memwatch": "^1.0.2", + "es6-error": "^4.0.2", + "left-pad": "^1.1.3", + "minimist": "^1.2.0", + "pretty-bytes": "^4.0.2" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "make-error": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", + "dev": true + }, + "mime-db": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", + "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", + "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", + "dev": true, + "requires": { + "mime-db": "~1.35.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true + }, + "node-forge": { + "version": "0.6.49", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.49.tgz", + "integrity": "sha1-8e6V1ddGI5OP4Z1piqWibVTS9g8=" + }, + "normalize-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-newline/-/normalize-newline-3.0.0.tgz", + "integrity": "sha1-HL6oBKukNgAfg5OKsh7AOdaa6dM=", + "dev": true + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "ora": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-1.4.0.tgz", + "integrity": "sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "cli-cursor": "^2.1.0", + "cli-spinners": "^1.0.1", + "log-symbols": "^2.1.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pretty-bytes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "qenv": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/qenv/-/qenv-1.1.7.tgz", + "integrity": "sha1-0D+L+P43SUzwjQkZ/nZdyoTZr64=", + "dev": true, + "requires": { + "lodash": "^4.17.4", + "smartfile": "^4.2.11", + "typings-global": "^1.0.16" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "require-reload": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/require-reload/-/require-reload-0.2.2.tgz", + "integrity": "sha1-KadZGEbK+RtuijzamRaD+V+NfUI=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "rsa-compat": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/rsa-compat/-/rsa-compat-1.5.1.tgz", + "integrity": "sha512-IPGhsT5HM501z49trBPT5ePrNcO3F3Gy9yCdd6H38VHLHNJqBxWdKyQasFjLhfQ5RYAmkJAkb8NnkuNgCC/zCg==", + "requires": { + "node-forge": "^0.6.41" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "smartchai": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/smartchai/-/smartchai-2.0.1.tgz", + "integrity": "sha512-9M+R56OhAHXScxgr2vzQqxGx0XMS0QXriNZuP7hjlbVbo2FUT+l60iEzbwPt9Ga+5u2cEEjSSoZEQVqlROaddA==", + "dev": true, + "requires": { + "@types/chai": "^4.1.2", + "@types/chai-as-promised": "^7.1.0", + "@types/chai-string": "^1.4.0", + "chai": "^4.1.2", + "chai-as-promised": "^7.1.1", + "chai-string": "^1.4.0" + } + }, + "smartdelay": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/smartdelay/-/smartdelay-1.0.4.tgz", + "integrity": "sha512-ab+d8ADiMMPKwrQNhoJYjmOR20VIIIxjknoEF9/PfMryic7tmvTmFrDMdcnMRohGNw/pN+4/I5dSUBdsDya7uw==", + "dev": true, + "requires": { + "smartq": "^1.1.1", + "typings-global": "^1.0.16" + } + }, + "smartenv": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/smartenv/-/smartenv-2.0.6.tgz", + "integrity": "sha1-s4xnmwwVG5r1SPaMOgcsKdFBfo0=", + "dev": true, + "requires": { + "lodash": "^4.17.4", + "smartq": "^1.1.1", + "typings-global": "^1.0.14" + } + }, + "smartfile": { + "version": "4.2.28", + "resolved": "https://registry.npmjs.org/smartfile/-/smartfile-4.2.28.tgz", + "integrity": "sha512-zUeAOLYftz8xLfKTs9U1NOuNPTA9jlvTQNr7lDIv84kXnr1AEpDb2Xwy1MdK1w733sBil/RkxtezrkvgRVAnNg==", + "dev": true, + "requires": { + "@types/fs-extra": "5.0.0", + "@types/vinyl": "^2.0.2", + "fs-extra": "^5.0.0", + "glob": "^7.1.2", + "js-yaml": "^3.10.0", + "require-reload": "0.2.2", + "smartpath": "^3.2.8", + "smartq": "^1.1.6", + "smartrequest": "^1.0.8", + "vinyl-file": "^3.0.0" + }, + "dependencies": { + "@types/fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "smartpath": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/smartpath/-/smartpath-3.2.8.tgz", + "integrity": "sha1-SDS9OouuIpW6rK26I8h6UBlS+UA=", + "dev": true, + "requires": { + "home": "^1.0.1", + "typings-global": "^1.0.14" + } + }, + "smartq": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/smartq/-/smartq-1.1.8.tgz", + "integrity": "sha512-FURlYW/C3bLeZjJcBVyw7bxCyQoCXiXbLCZcDUKznhXHaLu35c8m33/a2H8CA0rtb82lvzN8dRLnBZAcNMzNHQ==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "smartrequest": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/smartrequest/-/smartrequest-1.0.13.tgz", + "integrity": "sha512-OHrvzaxaA8Z8bJr33yxnyJF35nrWyaumsajqXm2Zkv0/2hfWO1NQAj02VVV51rLQfmtU0Hex7Nk19SoC8nOmYg==", + "dev": true, + "requires": { + "smartq": "^1.1.1" + } + }, + "smartstring": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/smartstring/-/smartstring-2.0.28.tgz", + "integrity": "sha512-pneklqLF1w3k043fyM3eMrJ1lXRnE4b/W6xlQrpkf2fLb/w1+NbnfJopJVfWJxtft8bVPHhYRk6fa1JKH4qTVw==", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0", + "js-base64": "^2.3.2", + "normalize-newline": "^3.0.0", + "randomatic": "^1.1.7", + "strip-indent": "^2.0.0", + "typings-global": "^1.0.20" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + } + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.8.tgz", + "integrity": "sha512-WqAEWPdb78u25RfKzOF0swBpY0dKrNdjc4GvLwm7ScX/o9bj8Eh/YL8mcMhBHYDGl87UkkSXDOFnW4G7GhWhGg==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-bom-buf": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz", + "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=", + "dev": true, + "requires": { + "is-utf8": "^0.2.1" + } + }, + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "dev": true, + "requires": { + "first-chunk-stream": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapbundle": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tapbundle/-/tapbundle-2.0.2.tgz", + "integrity": "sha512-y3ulfK4GKoVkuqF2QsrwVMWLXHqXeoDEzsw/Q9ZTJumNINbx4bcWPAdg2IcTHYgJHeSdF03HiB9EbHoUTRjD9Q==", + "dev": true, + "requires": { + "early": "^2.1.1", + "leakage": "^0.4.0", + "smartchai": "^2.0.1", + "smartdelay": "^1.0.4", + "smartq": "^1.1.8" + } + }, + "ts-node": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.0.tgz", + "integrity": "sha512-klJsfswHP0FuOLsvBZ/zzCfUvakOSSxds78mVeK7I+qP76YWtxf16hEZsp3U+b0kIo82R5UatGFeblYMqabb2Q==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + } + }, + "tsclass": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/tsclass/-/tsclass-1.0.20.tgz", + "integrity": "sha512-oreiwoX8YjXuSYy2cmsVS8/XC8YEb1ms7w9S9P+84sj+ZB6t/MEO8mJ7DaMZGH14zro8jcMSKVT7U9eTbknNLg==", + "dev": true + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "typescript": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.0.1.tgz", + "integrity": "sha512-zQIMOmC+372pC/CCVLqnQ0zSBiY7HHodU7mpQdjiZddek4GMj31I3dUJ7gAs9o65X7mnRma6OokOkc6f9jjfBg==", + "dev": true + }, + "typings-global": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/typings-global/-/typings-global-1.0.28.tgz", + "integrity": "sha512-6VOwJWEY2971HOMHu/7sURzUXiD4/LiMJPsMAOqkHHAtS3MVpLFE5gzTiHilsH9KY5VE1mBQirWIgWFsDuo90A==", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-file": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-3.0.0.tgz", + "integrity": "sha1-sQTZ5ECf+jJfqt1SBkLQo7SIs2U=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.3.0", + "strip-bom-buf": "^1.0.0", + "strip-bom-stream": "^2.0.0", + "vinyl": "^2.0.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 68aa655..9037ec0 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "dist/index.js", "typings": "dist/index.d.ts", "scripts": { - "test": "(npmts --nodocs)" + "test": "(tstest test/)" }, "repository": { "type": "git", @@ -23,20 +23,17 @@ }, "homepage": "https://gitlab.com/umbrellazone/smartacme#README", "dependencies": { - "@types/node-forge": "^0.6.8", - "dnsly": "^2.0.4", - "node-forge": "^0.7.1", - "rawacme": "^0.2.1", - "rsa-keygen": "^1.0.6", - "smartdelay": "^1.0.1", - "smartfile": "^4.1.10", - "smartq": "^1.1.1", - "smartstring": "^2.0.24", - "typings-global": "^1.0.16" + "@pushrocks/smartpromise": "^2.0.5", + "acme-v2": "^1.2.0", + "rsa-compat": "^1.5.1" }, "devDependencies": { - "cflare": "0.0.19", - "qenv": "^1.1.3", - "tapbundle": "^1.0.10" + "@gitzone/tsbuild": "^2.0.22", + "@gitzone/tsrun": "^1.1.12", + "@gitzone/tstest": "^1.0.13", + "@types/node": "^10.5.8", + "cflare": "^1.0.5", + "qenv": "^1.1.7", + "tapbundle": "^2.0.2" } } diff --git a/test/test.ts b/test/test.ts index 6f4a31e..a425c8a 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1,90 +1,13 @@ -import { expect, tap } from 'tapbundle' -import * as cflare from 'cflare' -import * as qenv from 'qenv' +import { tap, expect } from 'tapbundle'; -let testQenv = new qenv.Qenv(process.cwd(), process.cwd() + '/.nogit') +import * as smartacme from '../ts/index'; -// import the module to test -import * as smartacme from '../dist/index' +let smartAcmeInstance: smartacme.SmartAcme; -let myCflareAccount = new cflare.CflareAccount() -myCflareAccount.auth({ - email: process.env.CF_EMAIL, - key: process.env.CF_KEY +tap.test('should create a valid instance of SmartAcme' , async () => { + smartAcmeInstance = new smartacme.SmartAcme(); + await smartAcmeInstance.init() + console.log(smartAcmeInstance.directoryUrls); }) -let testSmartAcme: smartacme.SmartAcme -let testAcmeAccount: smartacme.AcmeAccount -let testAcmeCert: smartacme.AcmeCert -let testChallenge: smartacme.ISmartAcmeChallengeChosen - -tap.test('smartacme -> should create a valid instance', async (tools) => { - tools.timeout(10000) - testSmartAcme = new smartacme.SmartAcme(false) - await testSmartAcme.init().then(async () => { - expect(testSmartAcme).to.be.instanceOf(smartacme.SmartAcme) - }) -}) - -tap.test('smartacme -> should have created keyPair', async () => { - expect(testSmartAcme.acmeUrl).to.be.a('string') -}) - -tap.test('smartacme -> should register a new account', async (tools) => { - tools.timeout(10000) - await testSmartAcme.createAcmeAccount().then(async x => { - testAcmeAccount = x - }) -}) - -tap.test('smartacme -> should create a AcmeCert', async () => { - await testAcmeAccount.createAcmeCert('test2.bleu.de').then(async x => { - testAcmeCert = x - expect(testAcmeAccount).to.be.instanceOf(smartacme.AcmeCert) - }) -}) - -tap.test('smartacme -> should get a challenge for a AcmeCert', async (tools) => { - tools.timeout(10000) - await testAcmeCert.requestChallenge().then(async (challengeChosen) => { - console.log(challengeChosen) - testChallenge = challengeChosen - }) -}) - -tap.test('smartacme -> should set the challenge', async (tools) => { - tools.timeout(20000) - await myCflareAccount.createRecord( - testChallenge.domainNamePrefixed, - 'TXT', testChallenge.dnsKeyHash - ) -}) - -tap.test('smartacme -> should check for a DNS record', async (tools) => { - tools.timeout(20000) - await testAcmeCert.checkDns().then(x => { - console.log(x) - }) -}) - -tap.test('smartacme -> should accept the challenge', async (tools) => { - tools.timeout(10000) - await testAcmeCert.acceptChallenge() -}) - -tap.test('smartacme -> should poll for validation of a challenge', async (tools) => { - tools.timeout(10000) - await testAcmeCert.requestValidation().then(async x => { - console.log(x) - }) -}) - -tap.test('smartacme -> should remove the challenge', async (tools) => { - tools.timeout(20000) - await myCflareAccount.removeRecord( - testChallenge.domainNamePrefixed, - 'TXT' - ) -}) - -tap.start() +tap.start(); \ No newline at end of file diff --git a/ts/smartacme.classes.acmeaccount.ts b/ts/smartacme.classes.acmeaccount.ts deleted file mode 100644 index b2af012..0000000 --- a/ts/smartacme.classes.acmeaccount.ts +++ /dev/null @@ -1,94 +0,0 @@ -import * as q from 'smartq' - -import * as plugins from './smartacme.plugins' -import * as helpers from './smartacme.helpers' - -import { SmartAcme, IRsaKeypair } from './smartacme.classes.smartacme' -import { AcmeCert } from './smartacme.classes.acmecert' - -/** - * class AcmeAccount represents an AcmeAccount - */ -export class AcmeAccount { - parentSmartAcme: SmartAcme - location: string - link: string - JWK - constructor(smartAcmeParentArg: SmartAcme) { - this.parentSmartAcme = smartAcmeParentArg - } - - /** - * register the account with letsencrypt - */ - register() { - let done = q.defer() - this.parentSmartAcme.rawacmeClient.newReg( - { - contact: [ 'mailto:domains@lossless.org' ] - }, - (err, res) => { - if (err) { - console.error('smartacme: something went wrong:') - console.log(err) - done.reject(err) - return - } - this.JWK = res.body.key - this.link = res.headers.link - console.log(this.link) - this.location = res.headers.location - done.resolve() - }) - return done.promise - } - - /** - * agree to letsencrypr terms of service - */ - agreeTos() { - let done = q.defer() - let tosPart = this.link.split(',')[ 1 ] - let tosLinkPortion = tosPart.split(';')[ 0 ] - let url = tosLinkPortion.split(';')[ 0 ].trim().replace(/[<>]/g, '') - this.parentSmartAcme.rawacmeClient.post(this.location, { Agreement: url, resource: 'reg' }, (err, res) => { - if (err) { - console.log(err) - done.reject(err) - return - } - done.resolve() - }) - return done.promise - } - - createAcmeCert( - domainNameArg: string, - countryArg = 'Germany', - countryShortArg = 'DE', - city = 'Bremen', - companyArg = 'Some Company', - companyShortArg = 'SC' - - ) { - let done = q.defer() - let acmeCert = new AcmeCert( - { - bit: 2064, - key: null, // not needed right now - domain: domainNameArg, - country: countryArg, - country_short: countryShortArg, - locality: city, - organization: companyArg, - organization_short: companyShortArg, - password: null, - unstructured: null, - subject_alt_names: null - }, - this - ) - done.resolve(acmeCert) - return done.promise - } -} diff --git a/ts/smartacme.classes.acmecert.ts b/ts/smartacme.classes.acmecert.ts deleted file mode 100644 index 67705c5..0000000 --- a/ts/smartacme.classes.acmecert.ts +++ /dev/null @@ -1,255 +0,0 @@ -import * as q from 'smartq' - -import * as plugins from './smartacme.plugins' -import * as helpers from './smartacme.helpers' - -import { SmartAcme, IRsaKeypair } from './smartacme.classes.smartacme' -import { AcmeAccount } from './smartacme.classes.acmeaccount' - -/** - * types of challenges supported by letsencrypt and this module - */ -export type TChallengeType = 'dns-01' | 'http-01' - -/** - * values that a challenge's status can have - */ -export type TChallengeStatus = 'pending' - -export interface ISmartAcmeChallenge { - uri: string - status: TChallengeStatus - type: TChallengeType - token: string - keyAuthorization: string -} - -export interface ISmartAcmeChallengeChosen extends ISmartAcmeChallenge { - dnsKeyHash: string - domainName: string - domainNamePrefixed: string -} - -export interface IAcmeCsrConstructorOptions { - bit: number, - key: string, - domain: string, - country: string, - country_short: string, - locality: string, - organization: string, - organization_short: string, - password: string, - unstructured: string, - subject_alt_names: string[] -} - -// Dnsly instance (we really just need one) -let myDnsly = new plugins.dnsly.Dnsly('google') - -/** - * class AcmeCert represents a cert for domain - */ -export class AcmeCert { - domainName: string - attributes - fullchain: string - parentAcmeAccount: AcmeAccount - csr - validFrom: Date - validTo: Date - keypair: IRsaKeypair - keyPairFinal: IRsaKeypair - chosenChallenge: ISmartAcmeChallengeChosen - dnsKeyHash: string - constructor(optionsArg: IAcmeCsrConstructorOptions, parentAcmeAccount: AcmeAccount) { - this.domainName = optionsArg.domain - this.parentAcmeAccount = parentAcmeAccount - this.keypair = helpers.createKeypair(optionsArg.bit) - let privateKeyForged = plugins.nodeForge.pki.privateKeyFromPem(this.keypair.privateKey) - let publicKeyForged = plugins.nodeForge.pki.publicKeyToPem( - plugins.nodeForge.pki.setRsaPublicKey(privateKeyForged.n, privateKeyForged.e) - ) - this.keyPairFinal = { - privateKey: privateKeyForged, - publicKey: publicKeyForged - } - - // set dates - this.validFrom = new Date() - this.validTo = new Date() - this.validTo.setDate(this.validFrom.getDate() + 90) - - // set attributes - this.attributes = [ - { name: 'commonName', value: optionsArg.domain }, - { name: 'countryName', value: optionsArg.country }, - { shortName: 'ST', value: optionsArg.country_short }, - { name: 'localityName', value: optionsArg.locality }, - { name: 'organizationName', value: optionsArg.organization }, - { shortName: 'OU', value: optionsArg.organization_short }, - { name: 'challengePassword', value: optionsArg.password }, - { name: 'unstructuredName', value: optionsArg.unstructured } - ] - - // set up csr - this.csr = plugins.nodeForge.pki.createCertificationRequest() - this.csr.setSubject(this.attributes) - this.csr.setAttributes(this.attributes) - } - - /** - * requests a challenge for a domain - * @param domainNameArg - the domain name to request a challenge for - * @param challengeType - the challenge type to request - */ - requestChallenge(challengeTypeArg: TChallengeType = 'dns-01') { - let done = q.defer() - this.parentAcmeAccount.parentSmartAcme.rawacmeClient.newAuthz( - { - identifier: { - type: 'dns', - value: this.domainName - } - }, - this.parentAcmeAccount.parentSmartAcme.keyPair, - (err, res) => { - if (err) { - console.error('smartacme: something went wrong:') - console.log(err) - done.reject(err) - } - let preChosenChallenge = res.body.challenges.filter(x => { - return x.type === challengeTypeArg - })[ 0 ] - - /** - * the key is needed to accept the challenge - */ - let authKey: string = plugins.rawacme.keyAuthz( - preChosenChallenge.token, - this.parentAcmeAccount.parentSmartAcme.keyPair.publicKey - ) - - /** - * needed in case selected challenge is of type dns-01 - */ - this.dnsKeyHash = plugins.rawacme.dnsKeyAuthzHash(authKey) // needed if dns challenge is chosen - /** - * the return challenge - */ - this.chosenChallenge = { - uri: preChosenChallenge.uri, - type: preChosenChallenge.type, - token: preChosenChallenge.token, - keyAuthorization: authKey, - status: preChosenChallenge.status, - dnsKeyHash: this.dnsKeyHash, - domainName: this.domainName, - domainNamePrefixed: helpers.prefixName(this.domainName) - } - done.resolve(this.chosenChallenge) - } - ) - return done.promise - } - - /** - * checks if DNS records are set, will go through a max of 30 cycles - */ - async checkDns(cycleArg = 1) { - let result = await myDnsly.checkUntilAvailable(helpers.prefixName(this.domainName), 'TXT', this.dnsKeyHash) - if (result) { - console.log('DNS is set!') - return - } else { - throw new Error('DNS not set!') - } - } - - /** - * validates a challenge, only call after you have set the challenge at the expected location - */ - async requestValidation() { - let makeRequest = () => { - let done = q.defer() - this.parentAcmeAccount.parentSmartAcme.rawacmeClient.poll(this.chosenChallenge.uri, async (err, res) => { - if (err) { - console.log(err) - return - } - console.log(`Validation response:`) - console.log(JSON.stringify(res.body)) - if (res.body.status === 'pending' || res.body.status === 'invalid') { - await plugins.smartdelay.delayFor(3000) - makeRequest().then((x: any) => { done.resolve(x) }) - } else { - console.log('perfect!') - done.resolve(res.body) - } - }) - return done.promise - } - await makeRequest() - } - - /** - * requests a certificate - */ - requestCert() { - let done = q.defer() - let payload = { - csr: plugins.rawacme.base64.encode( - plugins.rawacme.toDer( - plugins.nodeForge.pki.certificationRequestToPem( - this.csr - ) - ) - ), - notBefore: this.validFrom.toISOString(), - notAfter: this.validTo.toISOString() - } - this.parentAcmeAccount.parentSmartAcme.rawacmeClient.newCert( - payload, - helpers.createKeypair(), - (err, res) => { - if (err) { - console.log(err) - done.reject(err) - } - console.log(res.body) - done.resolve(res.body) - }) - return done.promise - } - - /** - * getCertificate - takes care of cooldown, validation polling and certificate retrieval - */ - getCertificate() { - - } - - /** - * accept a challenge - for private use only - */ - acceptChallenge() { - let done = q.defer() - this.parentAcmeAccount.parentSmartAcme.rawacmeClient.post( - this.chosenChallenge.uri, - { - resource: 'challenge', - keyAuthorization: this.chosenChallenge.keyAuthorization - }, - this.parentAcmeAccount.parentSmartAcme.keyPair, - (err, res) => { - if (err) { - console.log(err) - done.reject(err) - } - done.resolve(res.body) - } - ) - return done.promise - } -} diff --git a/ts/smartacme.classes.keypair.ts b/ts/smartacme.classes.keypair.ts new file mode 100644 index 0000000..79ce65b --- /dev/null +++ b/ts/smartacme.classes.keypair.ts @@ -0,0 +1,27 @@ +import * as plugins from './smartacme.plugins'; +const rsa = require('rsa-compat').RSA; + +export class KeyPair { + rsaKeyPair: any + + /** + * generates a fresh rsa keyPair + */ + static async generateFresh(): Promise { + const done = plugins.smartpromise.defer(); + var options = { bitlen: 2048, exp: 65537, public: true, pem: true, internal: true }; + rsa.generateKeypair(options, function(err, keypair) { + if(err) { + console.log(err); + } + done.resolve(keypair); + }); + const result: any = await done.promise; + const keyPair = new KeyPair(result); + return keyPair; + } + + constructor(rsaKeyPairArg) { + this.rsaKeyPair = rsaKeyPairArg; + } +} diff --git a/ts/smartacme.classes.smartacme.ts b/ts/smartacme.classes.smartacme.ts index ff119bf..8d64542 100644 --- a/ts/smartacme.classes.smartacme.ts +++ b/ts/smartacme.classes.smartacme.ts @@ -1,82 +1,47 @@ -// third party modules -import * as q from 'smartq' // promises -import * as plugins from './smartacme.plugins' -import * as helpers from './smartacme.helpers' +const acme = require('acme-v2').ACME.create({ + RSA: require('rsa-compat').RSA, -import { AcmeAccount } from './smartacme.classes.acmeaccount' + // other overrides + promisify: require('util').promisify, -/** - * a rsa keypair needed for account creation and subsequent requests - */ -export interface IRsaKeypair { - publicKey: string - privateKey: string -} + // used for constructing user-agent + os: require('os'), + process: require('process'), -export { AcmeAccount } from './smartacme.classes.acmeaccount' -export { AcmeCert, ISmartAcmeChallenge, ISmartAcmeChallengeChosen } from './smartacme.classes.acmecert' + // used for overriding the default user-agent + userAgent: 'My custom UA String', + getUserAgentString: function(deps) { + return 'My custom UA String'; + }, + + // don't try to validate challenges locally + skipChallengeTest: false +}); + +import { KeyPair } from './smartacme.classes.keypair'; -/** - * class SmartAcme exports methods for maintaining SSL Certificates - */ export class SmartAcme { - acmeUrl: string // the acme url to use for this instance - productionBool: boolean // a boolean to quickly know wether we are in production or not - keyPair: IRsaKeypair // the keyPair needed for account creation - rawacmeClient + keyPair: KeyPair; + directoryUrls: any; - /** - * the constructor for class SmartAcme - */ - constructor(productionArg: boolean = false) { - this.productionBool = productionArg - this.keyPair = helpers.createKeypair() - if (this.productionBool) { - this.acmeUrl = plugins.rawacme.LETSENCRYPT_URL - } else { - this.acmeUrl = plugins.rawacme.LETSENCRYPT_STAGING_URL - } - } + async init() { + // get directory url + this.directoryUrls = await acme.init('https://acme-staging-v02.api.letsencrypt.org/directory'); - /** - * init the smartacme instance - */ - init() { - let done = q.defer() - plugins.rawacme.createClient( - { - url: this.acmeUrl, - publicKey: this.keyPair.publicKey, - privateKey: this.keyPair.privateKey - }, - (err, client) => { - if (err) { - console.error('smartacme: something went wrong:') - console.log(err) - done.reject(err) - return - } + // create keyPair + this.keyPair = await KeyPair.generateFresh(); - // make client available in class - this.rawacmeClient = client - done.resolve() + // get account + const registrationData = await acme.accounts.create({ + email: 'domains@lossless.org', // valid email (server checks MX records) + accountKeypair: this.keyPair.rsaKeyPair, + agreeToTerms: async tosUrl => { + return tosUrl; } - ) - return done.promise - } + }).catch(e => { + console.log(e); + }); - /** - * creates an account if not currently present in module - * @executes ASYNC - */ - createAcmeAccount() { - let done = q.defer() - let acmeAccount = new AcmeAccount(this) - acmeAccount.register().then(() => { - return acmeAccount.agreeTos() - }).then(() => { - done.resolve(acmeAccount) - }) - return done.promise + console.log(registrationData); } } diff --git a/ts/smartacme.helpers.ts b/ts/smartacme.helpers.ts deleted file mode 100644 index 609383b..0000000 --- a/ts/smartacme.helpers.ts +++ /dev/null @@ -1,50 +0,0 @@ -import 'typings-global' -import * as q from 'smartq' - -import * as plugins from './smartacme.plugins' - -import { SmartAcme, IRsaKeypair } from './smartacme.classes.smartacme' -import { AcmeAccount } from './smartacme.classes.acmeaccount' - -/** - * creates a keypair to use with requests and to generate JWK from - */ -export let createKeypair = (bit = 2048): IRsaKeypair => { - let result = plugins.rsaKeygen.generate(bit) - return { - publicKey: result.public_key, - privateKey: result.private_key - } -} - -/** - * prefix a domain name to make sure it complies with letsencrypt - */ -export let prefixName = (domainNameArg: string): string => { - return '_acme-challenge.' + domainNameArg -} - -/** - * gets an existing registration - * @executes ASYNC - */ -let getReg = (SmartAcmeArg: SmartAcme, location: string) => { - let done = q.defer() - let body = { resource: 'reg' } - SmartAcmeArg.rawacmeClient.post( - location, - body, - SmartAcmeArg.keyPair, - (err, res) => { - if (err) { - console.error('smartacme: something went wrong:') - console.log(err) - done.reject(err) - return - } - console.log(JSON.stringify(res.body)) - done.resolve() - } - ) - return done.promise -} diff --git a/ts/smartacme.paths.ts b/ts/smartacme.paths.ts deleted file mode 100644 index 91bfc39..0000000 --- a/ts/smartacme.paths.ts +++ /dev/null @@ -1,6 +0,0 @@ -import * as path from 'path' -import * as smartfile from 'smartfile' - -export let packageDir = path.join(__dirname,'../') -export let assetDir = path.join(packageDir,'assets/') -smartfile.fs.ensureDirSync(assetDir) diff --git a/ts/smartacme.plugins.ts b/ts/smartacme.plugins.ts index 2d4b85e..869640d 100644 --- a/ts/smartacme.plugins.ts +++ b/ts/smartacme.plugins.ts @@ -1,22 +1,5 @@ -import 'typings-global' // typings for node - -import * as path from 'path' // native node path module -let rsaKeygen = require('rsa-keygen') // rsa keygen -let rawacme = require('rawacme') // acme helper functions -let nodeForge = require('node-forge') - -// push.rocks modules here -import * as dnsly from 'dnsly' -import * as smartdelay from 'smartdelay' -import * as smartfile from 'smartfile' -import * as smartstring from 'smartstring' +import * as smartpromise from '@pushrocks/smartpromise'; export { - dnsly, - rsaKeygen, - rawacme, - nodeForge, - smartdelay, - smartfile, - smartstring -} + smartpromise +} \ No newline at end of file