From b4100688ac0e7e555b85094ea5dec9c495c3c20b Mon Sep 17 00:00:00 2001 From: Phil Kunz Date: Thu, 6 May 2021 10:04:51 +0000 Subject: [PATCH] fix(version matching): now respecting packages without latest tag --- ts/smartnpm.classes.npmpackage.ts | 20 +++++++++++++++----- ts/smartnpm.classes.npmregistry.ts | 16 ++++++++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/ts/smartnpm.classes.npmpackage.ts b/ts/smartnpm.classes.npmpackage.ts index 416a01a..e77ed5b 100644 --- a/ts/smartnpm.classes.npmpackage.ts +++ b/ts/smartnpm.classes.npmpackage.ts @@ -108,21 +108,20 @@ export class NpmPackage { if (optionsArg.distTag && optionsArg.version) { throw new Error('Please either specify version OR disttag, not both.'); } - let targetVersion: plugins.smartversion.SmartVersion; + let targetVersionString: string; if (optionsArg.distTag) { const targetDistTag = this.allDistTags.find((distTag) => { return distTag.name === optionsArg.distTag; }); if (targetDistTag) { - targetVersion = new plugins.smartversion.SmartVersion(targetDistTag.targetVersion); + targetVersionString = targetDistTag.targetVersion; } } else { - targetVersion = plugins.smartversion.SmartVersion.fromFuzzyString(optionsArg.version); + targetVersionString = optionsArg.version; } // lets find the best matching release - const versionStrings = this.allVersions.map((packageVersion) => packageVersion.version); - const bestMatchingVersion = targetVersion.getBestMatch(versionStrings); + const bestMatchingVersion = this.getBestMatchingVersion(targetVersionString); if (!bestMatchingVersion) { return null; } @@ -173,4 +172,15 @@ export class NpmPackage { * updates the package with information from the registry */ update() {} + + /** */ + public getBestMatchingVersion(versionArg: string): string { + // lets find the best matching release + const targetVersion = plugins.smartversion.SmartVersion.fromFuzzyString(versionArg); + const versionStrings = this.allVersions.map((packageVersion) => packageVersion.version); + const bestMatchingVersion = targetVersion.getBestMatch(versionStrings); + if (!bestMatchingVersion) { + return null; + } + } } diff --git a/ts/smartnpm.classes.npmregistry.ts b/ts/smartnpm.classes.npmregistry.ts index db82b21..f55aeec 100644 --- a/ts/smartnpm.classes.npmregistry.ts +++ b/ts/smartnpm.classes.npmregistry.ts @@ -70,6 +70,14 @@ export class NpmRegistry { const cachedFile: plugins.smartfile.Smartfile = await this.registryCache.getCachedFile(fileId); if (!cachedFile) { const npmPackage = await this.getPackageInfo(packageNameArg); + if (!optionsArg?.version && !optionsArg?.distTag) { + const latestAvailable = npmPackage.allDistTags.find(packageArg => packageArg.name === 'latest'); + if (!latestAvailable) { + optionsArg = { + version: npmPackage.getBestMatchingVersion('*') + }; + } + } const fileResult = await npmPackage.getFileFromPackage(filePath, optionsArg); this.registryCache.cacheSmartFile(fileId, fileResult); return fileResult; @@ -83,6 +91,14 @@ export class NpmRegistry { version?: string; }): Promise { const npmPackage = await this.getPackageInfo(packageNameArg); + if (!optionsArg?.version && !optionsArg?.distTag) { + const latestAvailable = npmPackage.allDistTags.find(packageArg => packageArg.name === 'latest'); + if (!latestAvailable) { + optionsArg = { + version: npmPackage.getBestMatchingVersion('*') + }; + } + } return npmPackage.getFilesFromPackage(filePath, optionsArg); }