diff --git a/test/test.ts b/test/test.ts index ff9600a..0b21893 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1,8 +1,14 @@ import { expect, tap } from '@pushrocks/tapbundle'; import * as smartupdate from '../ts/index'; +let testSmartUpdate: smartupdate.SmartUpdate; + +tap.test('should create an instance of SmartUpdate', async () => { + testSmartUpdate = new smartupdate.SmartUpdate(); +}); + tap.test('should check for a npm module', async () => { - await smartupdate.standardHandler.check('lodash', '1.0.5'); + await testSmartUpdate.check('lodash', '1.0.5'); }); tap.start(); diff --git a/ts/index.ts b/ts/index.ts index 73ca21e..987505f 100644 --- a/ts/index.ts +++ b/ts/index.ts @@ -1,104 +1 @@ -import * as plugins from './smartupdate.plugins'; - -import { TimeStamp } from '@pushrocks/smarttime'; - -interface ICacheStatus { - lastCheck: number; - latestVersion: string; - performedUpgrade: boolean; -} - -import { KeyValueStore } from '@pushrocks/npmextra'; - -export class SmartUpdate { - public kvStore = new plugins.npmextra.KeyValueStore('custom', 'global_smartupdate'); - - public async check(npmnameArg: string, compareVersion: string, changelogUrlArg?: string) { - // the newData to write - const timeStamp = new TimeStamp(); - const newData = { - lastCheck: timeStamp.milliSeconds, - latestVersion: 'x.x.x', - performedUpgrade: false - }; - - // the comparison data from the keyValue store - const result: ICacheStatus = await this.kvStore.readKey(npmnameArg); - - if (result) { - const lastCheckTimeStamp = TimeStamp.fromMilliSeconds(result.lastCheck); - const tresholdTime = plugins.smarttime.getMilliSecondsFromUnits({ hours: 1 }); - if (!lastCheckTimeStamp.isOlderThan(timeStamp, tresholdTime)) { - newData.lastCheck = lastCheckTimeStamp.milliSeconds; - const nextCheckInMinutes = - (tresholdTime - (timeStamp.milliSeconds - lastCheckTimeStamp.milliSeconds)) / 60000; - console.log( - `next update check in less than ${Math.floor(nextCheckInMinutes) + 1} minute(s): ` + - `${plugins.consolecolor.coloredString( - `${npmnameArg} has already been checked within the last hour.`, - 'pink' - )}` - ); - return; - } - } - const npmPackage = await this.getNpmPackageFromRegistry(npmnameArg); - if (!npmPackage) { - plugins.smartlog.defaultLogger.log('warn', 'failed to retrieve package information...'); - plugins.smartlog.defaultLogger.log('info', 'npms.io might be down'); - return; - } - newData.latestVersion = npmPackage.version; - const upgradeBool = await this.checkIfUpgrade(npmPackage, compareVersion, changelogUrlArg); - if (upgradeBool) { - // TODO: - } - this.kvStore.writeKey(npmnameArg, newData); - } - - private async getNpmPackageFromRegistry(npmnameArg): Promise { - console.log( - `smartupdate: checking for newer version of ${plugins.consolecolor.coloredString( - npmnameArg, - 'pink' - )}...` - ); - const npmRegistry = new plugins.smartnpm.NpmRegistry(); - const npmPackage = npmRegistry.getPackageInfo(npmnameArg); - return npmPackage; - } - - private async checkIfUpgrade( - npmPackage: plugins.smartnpm.NpmPackage, - localVersionStringArg: string, - changelogUrlArg?: string - ) { - // create Version objects - const versionNpm = new plugins.smartversion.SmartVersion(npmPackage.version); - const versionLocal = new plugins.smartversion.SmartVersion(localVersionStringArg); - if (!versionNpm.greaterThan(versionLocal)) { - console.log( - `smartupdate: You are running the latest version of ${plugins.consolecolor.coloredString( - npmPackage.name, - 'pink' - )}` - ); - return false; - } else { - plugins.smartlog.defaultLogger.log( - 'warn', - `There is a newer version of ${npmPackage.name} available on npm.` - ); - plugins.smartlog.defaultLogger.log( - 'warn', - `Your version: ${versionLocal.versionString} | version on npm: ${versionNpm.versionString}` - ); - if (!process.env.CI && changelogUrlArg) { - console.log('trying to open changelog...'); - plugins.smartopen.openUrl(changelogUrlArg); - } - return true; - } - } -} -export let standardHandler = new SmartUpdate(); +export { SmartUpdate } from './smartupdate.classes.smartupdate'; \ No newline at end of file diff --git a/ts/smartupdate.classes.smartupdate.ts b/ts/smartupdate.classes.smartupdate.ts new file mode 100644 index 0000000..33d34a7 --- /dev/null +++ b/ts/smartupdate.classes.smartupdate.ts @@ -0,0 +1,111 @@ +import * as plugins from './smartupdate.plugins'; + +import { TimeStamp } from '@pushrocks/smarttime'; + +interface ICacheStatus { + lastCheck: number; + latestVersion: string; + performedUpgrade: boolean; +} + +import { KeyValueStore } from '@pushrocks/npmextra'; + +export class SmartUpdate { + public npmRegistry: plugins.smartnpm.NpmRegistry; + public kvStore = new plugins.npmextra.KeyValueStore('custom', 'global_smartupdate'); + + constructor(optionsArg: plugins.smartnpm.INpmRegistryConstructorOptions = {}) { + this.npmRegistry = new plugins.smartnpm.NpmRegistry(optionsArg); + } + + public async checkForCli(npmnameArg: string, compareVersion: string, changelogUrlArg?: string) { + // the newData to write + const timeStamp = new TimeStamp(); + const newCacheData: ICacheStatus = { + lastCheck: timeStamp.milliSeconds, + latestVersion: 'x.x.x', + performedUpgrade: false + }; + + // the comparison data from the keyValue store + const retrievedCacheData: ICacheStatus = await this.kvStore.readKey(npmnameArg); + + if (retrievedCacheData) { + const lastCheckTimeStamp = TimeStamp.fromMilliSeconds(retrievedCacheData.lastCheck); + const tresholdTime = plugins.smarttime.getMilliSecondsFromUnits({ hours: 1 }); + if (!lastCheckTimeStamp.isOlderThan(timeStamp, tresholdTime)) { + newCacheData.lastCheck = lastCheckTimeStamp.milliSeconds; + const nextCheckInMinutes = + (tresholdTime - (timeStamp.milliSeconds - lastCheckTimeStamp.milliSeconds)) / 60000; + console.log( + `next update check in less than ${Math.floor(nextCheckInMinutes) + 1} minute(s): ` + + `${plugins.consolecolor.coloredString( + `${npmnameArg} has already been checked within the last hour.`, + 'pink' + )}` + ); + return false; // don't upgrade if checked within reasonable time + } + } + + const upgradeBool = await this.check(npmnameArg, compareVersion, changelogUrlArg); + if (upgradeBool) { + const npmPackage = await this.npmRegistry.getPackageInfo(npmnameArg); + newCacheData.latestVersion = npmPackage.version; + this.kvStore.writeKey(npmnameArg, newCacheData); + } + + return upgradeBool; + } + + private async getNpmPackageFromRegistry(npmnameArg): Promise { + console.log( + `smartupdate: checking for newer version of ${plugins.consolecolor.coloredString( + npmnameArg, + 'pink' + )}...` + ); + const npmPackage = this.npmRegistry.getPackageInfo(npmnameArg); + return npmPackage; + } + + public async check( + npmPackageName: string, + localVersionStringArg: string, + changelogUrlArg?: string + ) { + const npmPackage = await this.getNpmPackageFromRegistry(npmPackageName); + if (!npmPackage) { + plugins.smartlog.defaultLogger.log('warn', 'failed to retrieve package information...'); + plugins.smartlog.defaultLogger.log('info', 'is the registry down?'); + return; + } + + // create Version objects + const versionNpm = new plugins.smartversion.SmartVersion(npmPackage.version); + const versionLocal = new plugins.smartversion.SmartVersion(localVersionStringArg); + if (!versionNpm.greaterThan(versionLocal)) { + console.log( + `smartupdate: You are running the latest version of ${plugins.consolecolor.coloredString( + npmPackage.name, + 'pink' + )}` + ); + return false; + } else { + plugins.smartlog.defaultLogger.log( + 'warn', + `There is a newer version of ${npmPackage.name} available on npm.` + ); + plugins.smartlog.defaultLogger.log( + 'warn', + `Your version: ${versionLocal.versionString} | version on npm: ${versionNpm.versionString}` + ); + if (!process.env.CI && changelogUrlArg) { + console.log('trying to open changelog...'); + plugins.smartopen.openUrl(changelogUrlArg); + } + return true; + } + } +}