diff --git a/dist/index.d.ts b/dist/index.d.ts index d3d8f51..5b5a37e 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,2 +1,8 @@ -export declare let check: (npmname: string) => void; -export declare let standardExport: string; +import { KeyValueStore } from 'npmextra'; +export declare class SmartUpdate { + kvStore: KeyValueStore; + check(npmnameArg: string, compareVersion: string): Promise; + private getNpmPackageFromRegistry(npmnameArg); + private checkIfUpgrade(npmPackage, versionArg); +} +export declare let standardHandler: SmartUpdate; diff --git a/dist/index.js b/dist/index.js index f9e4c99..61b3fb1 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,14 +1,68 @@ "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 plugins = require("./smartupdate.plugins"); +const smarttime_1 = require("smarttime"); class SmartUpdate { constructor() { this.kvStore = new plugins.npmextra.KeyValueStore('custom', 'global:smartupdate'); } - check(npmname) { + check(npmnameArg, compareVersion) { + return __awaiter(this, void 0, void 0, function* () { + let result = yield this.kvStore.readKey(npmnameArg); + let timeStamp = new smarttime_1.TimeStamp(); + // the newData to write + let newData = { + lastCheck: timeStamp.milliSeconds, + latestVersion: 'x.x.x', + performedUpgrade: false + }; + if (result) { + let lastCheckTimeStamp = smarttime_1.TimeStamp.fromMilliSeconds(result.lastCheck); + let compareTime = plugins.smarttime.getMilliSecondsFromUnits({ days: 1 }); + if (!lastCheckTimeStamp.isOlderThan(timeStamp, compareTime)) { + plugins.beautylog.log('not checking for new version since this has been done already for today'); + return; + } + } + let npmPackage = yield this.getNpmPackageFromRegistry(npmnameArg); + newData.latestVersion = npmPackage.version; + let upgradeBool = yield this.checkIfUpgrade(npmPackage, compareVersion); + if (upgradeBool) { + } + this.kvStore.writeKey(npmnameArg, newData); + }); + } + getNpmPackageFromRegistry(npmnameArg) { + return __awaiter(this, void 0, void 0, function* () { + plugins.beautylog.log(`checking for newer version of ${npmnameArg}...`); + let npmRegistry = new plugins.smartnpm.NpmRegistry(); + let npmPackage = (yield npmRegistry.search({ name: npmnameArg, boostExact: true }))[0]; + return npmPackage; + }); + } + checkIfUpgrade(npmPackage, versionArg) { + return __awaiter(this, void 0, void 0, function* () { + if (npmPackage.version === versionArg) { + plugins.beautylog.ok(`You are running the latest version of ${npmPackage.name}`); + return false; + } + else { + plugins.beautylog.warn(`There is a newer version of ${npmPackage.name} available on npm.`); + plugins.beautylog.info(`Your version: ${versionArg} | version on npm: ${npmPackage.version}`); + plugins.beautylog.warn(`!!! You should upgrade!!!`); + return true; + } + }); } } -let standardInstance = new SmartUpdate(); -exports.check = standardInstance.check; -exports.standardExport = 'Hi there! :) This is a exported string'; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlEQUFnRDtBQUVoRDtJQUFBO1FBQ0UsWUFBTyxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUE7SUFJOUUsQ0FBQztJQUhDLEtBQUssQ0FBRSxPQUFlO0lBRXRCLENBQUM7Q0FDRjtBQUNELElBQUksZ0JBQWdCLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQTtBQUU3QixRQUFBLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUE7QUFHOUIsUUFBQSxjQUFjLEdBQUcsd0NBQXdDLENBQUEifQ== \ No newline at end of file +exports.SmartUpdate = SmartUpdate; +exports.standardHandler = new SmartUpdate(); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsaURBQWdEO0FBRWhELHlDQUFxQztBQVVyQztJQUFBO1FBQ0UsWUFBTyxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUE7SUErQzlFLENBQUM7SUE3Q08sS0FBSyxDQUFFLFVBQWtCLEVBQUUsY0FBc0I7O1lBQ3JELElBQUksTUFBTSxHQUFpQixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQ2pFLElBQUksU0FBUyxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFBO1lBRS9CLHVCQUF1QjtZQUN2QixJQUFJLE9BQU8sR0FBRztnQkFDWixTQUFTLEVBQUUsU0FBUyxDQUFDLFlBQVk7Z0JBQ2pDLGFBQWEsRUFBRSxPQUFPO2dCQUN0QixnQkFBZ0IsRUFBRSxLQUFLO2FBQ3hCLENBQUE7WUFDRCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNYLElBQUksa0JBQWtCLEdBQUcscUJBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQ3JFLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtnQkFDekUsRUFBRSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDNUQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMseUVBQXlFLENBQUMsQ0FBQTtvQkFDaEcsTUFBTSxDQUFBO2dCQUNSLENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDakUsT0FBTyxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFBO1lBQzFDLElBQUksV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUE7WUFDdkUsRUFBRSxDQUFBLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUVqQixDQUFDO1lBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQzVDLENBQUM7S0FBQTtJQUVhLHlCQUF5QixDQUFFLFVBQVU7O1lBQ2pELE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxVQUFVLEtBQUssQ0FBQyxDQUFBO1lBQ3ZFLElBQUksV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtZQUNwRCxJQUFJLFVBQVUsR0FBRyxDQUFDLE1BQU0sV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUN0RixNQUFNLENBQUMsVUFBVSxDQUFBO1FBQ25CLENBQUM7S0FBQTtJQUVhLGNBQWMsQ0FBRSxVQUF1QyxFQUFFLFVBQWtCOztZQUN2RixFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLHlDQUF5QyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtnQkFDaEYsTUFBTSxDQUFDLEtBQUssQ0FBQTtZQUNkLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDTixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQywrQkFBK0IsVUFBVSxDQUFDLElBQUksb0JBQW9CLENBQUMsQ0FBQTtnQkFDMUYsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLFVBQVUsc0JBQXNCLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO2dCQUM3RixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO2dCQUNuRCxNQUFNLENBQUMsSUFBSSxDQUFBO1lBQ2IsQ0FBQztRQUNILENBQUM7S0FBQTtDQUNGO0FBaERELGtDQWdEQztBQUNVLFFBQUEsZUFBZSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUEifQ== \ No newline at end of file diff --git a/dist/smartupdate.plugins.d.ts b/dist/smartupdate.plugins.d.ts index 366f36a..507332f 100644 --- a/dist/smartupdate.plugins.d.ts +++ b/dist/smartupdate.plugins.d.ts @@ -1,4 +1,6 @@ import 'typings-global'; +import * as beautylog from 'beautylog'; import * as npmextra from 'npmextra'; import * as smartnpm from 'smartnpm'; -export { npmextra, smartnpm }; +import * as smarttime from 'smarttime'; +export { beautylog, npmextra, smartnpm, smarttime }; diff --git a/dist/smartupdate.plugins.js b/dist/smartupdate.plugins.js index 34f4f59..f94e729 100644 --- a/dist/smartupdate.plugins.js +++ b/dist/smartupdate.plugins.js @@ -1,8 +1,12 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); require("typings-global"); +const beautylog = require("beautylog"); +exports.beautylog = beautylog; const npmextra = require("npmextra"); exports.npmextra = npmextra; const smartnpm = require("smartnpm"); exports.smartnpm = smartnpm; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR1cGRhdGUucGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0dXBkYXRlLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwwQkFBdUI7QUFFdkIscUNBQW9DO0FBSWxDLDRCQUFRO0FBSFYscUNBQW9DO0FBSWxDLDRCQUFRIn0= \ No newline at end of file +const smarttime = require("smarttime"); +exports.smarttime = smarttime; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR1cGRhdGUucGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0dXBkYXRlLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwwQkFBdUI7QUFFdkIsdUNBQXNDO0FBTXBDLDhCQUFTO0FBTFgscUNBQW9DO0FBTWxDLDRCQUFRO0FBTFYscUNBQW9DO0FBTWxDLDRCQUFRO0FBTFYsdUNBQXNDO0FBTXBDLDhCQUFTIn0= \ No newline at end of file diff --git a/npmextra.json b/npmextra.json index c4494f5..6e99cc1 100644 --- a/npmextra.json +++ b/npmextra.json @@ -3,5 +3,8 @@ "globalNpmTools": [ "npmts" ] + }, + "npmts": { + "coverageTreshold": 50 } } \ No newline at end of file diff --git a/package.json b/package.json index ba96a6b..f9370eb 100644 --- a/package.json +++ b/package.json @@ -10,11 +10,13 @@ "test": "(npmts)" }, "devDependencies": { - "tapbundle": "^1.0.13" + "tapbundle": "^1.1.1" }, "dependencies": { - "npmextra": "^2.0.8", - "smartnpm": "^1.0.3", - "typings-global": "^1.0.16" + "beautylog": "^6.1.10", + "npmextra": "^2.0.9", + "smartnpm": "^1.0.4", + "smarttime": "^1.0.6", + "typings-global": "^1.0.20" } } diff --git a/test/test.ts b/test/test.ts index 110a253..dfdb537 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1,8 +1,8 @@ import { expect, tap } from 'tapbundle' import * as smartupdate from '../ts/index' -tap.test('first test', async () => { - console.log(smartupdate.standardExport) +tap.test('should check for a npm module', async () => { + await smartupdate.standardHandler.check('npmts', '8.0.5') }) tap.start() diff --git a/ts/index.ts b/ts/index.ts index 3d26e60..272f51b 100644 --- a/ts/index.ts +++ b/ts/index.ts @@ -1,25 +1,62 @@ import * as plugins from './smartupdate.plugins' +import { TimeStamp } from 'smarttime' + interface ICacheStatus { - lastCheck + lastCheck: number + latestVersion: string + performedUpgrade: boolean } -class SmartUpdate { +import { KeyValueStore } from 'npmextra' + +export class SmartUpdate { kvStore = new plugins.npmextra.KeyValueStore('custom', 'global:smartupdate') - - async checkCacheStatus () { - let result: ICacheStatus = await this.kvStore.read(npmname) - if(result && result) { + + async check (npmnameArg: string, compareVersion: string) { + let result: ICacheStatus = await this.kvStore.readKey(npmnameArg) + let timeStamp = new TimeStamp() + + // the newData to write + let newData = { + lastCheck: timeStamp.milliSeconds, + latestVersion: 'x.x.x', + performedUpgrade: false + } + if (result) { + let lastCheckTimeStamp = TimeStamp.fromMilliSeconds(result.lastCheck) + let compareTime = plugins.smarttime.getMilliSecondsFromUnits({ days: 1 }) + if (!lastCheckTimeStamp.isOlderThan(timeStamp, compareTime)) { + plugins.beautylog.log('not checking for new version since this has been done already for today') + return + } + } + let npmPackage = await this.getNpmPackageFromRegistry(npmnameArg) + newData.latestVersion = npmPackage.version + let upgradeBool = await this.checkIfUpgrade(npmPackage, compareVersion) + if(upgradeBool) { } + this.kvStore.writeKey(npmnameArg, newData) } - - async check (npmname: string) { + + private async getNpmPackageFromRegistry (npmnameArg) { + plugins.beautylog.log(`checking for newer version of ${npmnameArg}...`) + let npmRegistry = new plugins.smartnpm.NpmRegistry() + let npmPackage = (await npmRegistry.search({ name: npmnameArg, boostExact: true }))[0] + return npmPackage + } + + private async checkIfUpgrade (npmPackage: plugins.smartnpm.NpmPackage, versionArg: string) { + if (npmPackage.version === versionArg) { + plugins.beautylog.ok(`You are running the latest version of ${npmPackage.name}`) + return false + } else { + plugins.beautylog.warn(`There is a newer version of ${npmPackage.name} available on npm.`) + plugins.beautylog.info(`Your version: ${versionArg} | version on npm: ${npmPackage.version}`) + plugins.beautylog.warn(`!!! You should upgrade!!!`) + return true + } } } -let standardInstance = new SmartUpdate() - -export let check = standardInstance.check - - -export let standardExport = 'Hi there! :) This is a exported string' +export let standardHandler = new SmartUpdate() diff --git a/ts/smartupdate.plugins.ts b/ts/smartupdate.plugins.ts index 8d04880..18c5d8e 100644 --- a/ts/smartupdate.plugins.ts +++ b/ts/smartupdate.plugins.ts @@ -1,9 +1,13 @@ import 'typings-global' +import * as beautylog from 'beautylog' import * as npmextra from 'npmextra' import * as smartnpm from 'smartnpm' +import * as smarttime from 'smarttime' export { + beautylog, npmextra, - smartnpm + smartnpm, + smarttime } diff --git a/yarn.lock b/yarn.lock index a865d11..a6239bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34,15 +34,15 @@ "@types/node" "*" "@types/glob@*": - version "5.0.30" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.30.tgz#1026409c5625a8689074602808d082b2867b8a51" + version "5.0.31" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.31.tgz#6cb8500bd170750c1948f785cc5828e9cff0c36a" dependencies: "@types/minimatch" "*" "@types/node" "*" "@types/lodash@4.x.x", "@types/lodash@^4.14.55", "@types/lodash@^4.14.67", "@types/lodash@^4.14.68": - version "4.14.72" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.72.tgz#f090cf6eb1fee1647a0efa1ebe18b0b78ed551c6" + version "4.14.73" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.73.tgz#9837e47db8643ba5bcef2c7921f37d90f9c24213" "@types/minimatch@*": version "3.0.0" @@ -107,11 +107,12 @@ balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" -beautycolor@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/beautycolor/-/beautycolor-1.0.7.tgz#a4715738ac4c8221371e9cbeb5a6cc6d11ecbf7c" +beautycolor@^1.0.7, beautycolor@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/beautycolor/-/beautycolor-1.0.10.tgz#4b50758e59115839b3bb2bfe8aaaec9e29c747dd" dependencies: ansi-256-colors "^1.1.0" + tapbundle "^1.1.1" typings-global "^1.0.14" beautylog@^6.1.10: @@ -459,17 +460,17 @@ nan@^2.3.2: version "2.6.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" -npmextra@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/npmextra/-/npmextra-2.0.8.tgz#9fd3c451edee5a65da0e61df331be6f2313f4676" +npmextra@^2.0.9: + version "2.0.9" + resolved "https://registry.yarnpkg.com/npmextra/-/npmextra-2.0.9.tgz#bd32b91590a8b3e2eabdfed26c324a1952758c2c" dependencies: beautylog "^6.1.10" - smartfile "^4.2.17" + smartfile "^4.2.20" smartlodash "^1.0.1" smartpath "^3.2.8" smartq "^1.1.6" taskbuffer "^1.0.22" - typings-global "^1.0.19" + typings-global "^1.0.20" object-keys@^1.0.8: version "1.0.11" @@ -550,8 +551,8 @@ rechoir@^0.6.2: resolve "^1.1.6" remove-trailing-separator@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511" + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" replace-ext@^1.0.0: version "1.0.0" @@ -626,7 +627,7 @@ smartenv@^2.0.0: smartq "^1.1.1" typings-global "^1.0.14" -smartfile@^4.2.17: +smartfile@^4.2.20: version "4.2.20" resolved "https://registry.yarnpkg.com/smartfile/-/smartfile-4.2.20.tgz#abc37c04fb7b3afea68fa295dfb80083361a8028" dependencies: @@ -650,10 +651,11 @@ smartlodash@^1.0.1: "@types/node" "^8.0.10" lodash "^4.17.4" -smartnpm@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/smartnpm/-/smartnpm-1.0.3.tgz#62efa486d92f21d1299209ced5557e0796beccbd" +smartnpm@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/smartnpm/-/smartnpm-1.0.4.tgz#026ce3b3f3b46ec546de51908a0d408848466c0d" dependencies: + beautycolor "^1.0.9" beautylog "^6.1.10" smartrequest "^1.0.6" typings-global "^1.0.16" @@ -690,6 +692,12 @@ smartshell@^1.0.6: typings-global "^1.0.19" which "^1.2.14" +smarttime@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/smarttime/-/smarttime-1.0.6.tgz#0412a021cff88e8e41b766103a2d9e42fe816ddc" + dependencies: + typings-global "^1.0.16" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -733,7 +741,7 @@ symbol-observable@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" -tapbundle@^1.0.13: +tapbundle@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/tapbundle/-/tapbundle-1.1.1.tgz#ec4172c0e82a77b1f6133fef2606311ede28a62d" dependencies: