From 5cde95a04f2f040fffd0798822058f9692761cc4 Mon Sep 17 00:00:00 2001 From: Merlin Beutlberger Date: Thu, 24 Aug 2023 16:36:16 +0200 Subject: [PATCH] [FEATURE] Resolvers: Use npm tags for determining 'latest' --- lib/ui5Framework/AbstractResolver.js | 11 +++++++++++ lib/ui5Framework/Openui5Resolver.js | 11 +++++++++++ lib/ui5Framework/Sapui5Resolver.js | 11 +++++++++++ lib/ui5Framework/npm/Installer.js | 5 +++++ 4 files changed, 38 insertions(+) diff --git a/lib/ui5Framework/AbstractResolver.js b/lib/ui5Framework/AbstractResolver.js index 0a6e9e70c..7ce26ba40 100644 --- a/lib/ui5Framework/AbstractResolver.js +++ b/lib/ui5Framework/AbstractResolver.js @@ -215,6 +215,13 @@ class AbstractResolver { } static async resolveVersion(version, {ui5HomeDir, cwd} = {}) { + if (version === "latest") { + const tagVersion = this.fetchTag("latest", {ui5HomeDir, cwd}); + if (tagVersion) { + return tagVersion; + } + } + let spec; const isSnapshotVersion = version.toLowerCase().endsWith("-snapshot"); if (version === "latest" || version === "latest-snapshot") { @@ -238,6 +245,7 @@ class AbstractResolver { throw new Error(`Framework version specifier "${version}" is incorrect or not supported`); } } + const versions = await this.fetchAllVersions({ui5HomeDir, cwd}); const resolvedVersion = semver.maxSatisfying(versions, spec, { includePrerelease: isSnapshotVersion @@ -271,6 +279,9 @@ class AbstractResolver { static fetchAllVersions(options) { throw new Error("AbstractResolver: static fetchAllVersions must be implemented!"); } + static fetchTag(tagName, options) { + throw new Error("AbstractResolver: static fetchDistTag must be implemented!"); + } } /* istanbul ignore else */ diff --git a/lib/ui5Framework/Openui5Resolver.js b/lib/ui5Framework/Openui5Resolver.js index 55a8115de..2c895103e 100644 --- a/lib/ui5Framework/Openui5Resolver.js +++ b/lib/ui5Framework/Openui5Resolver.js @@ -93,6 +93,17 @@ class Openui5Resolver extends AbstractResolver { }); return await installer.fetchPackageVersions({pkgName: OPENUI5_CORE_PACKAGE}); } + + static async fetchTag(tagName, {ui5HomeDir, cwd} = {}) { + const installer = new Installer({ + cwd: cwd ? path.resolve(cwd) : process.cwd(), + ui5HomeDir: + ui5HomeDir ? path.resolve(ui5HomeDir) : + path.join(os.homedir(), ".ui5") + }); + const distTags = await installer.fetchPackageDistTags({pkgName: OPENUI5_CORE_PACKAGE}); + return distTags[tagName]; + } } export default Openui5Resolver; diff --git a/lib/ui5Framework/Sapui5Resolver.js b/lib/ui5Framework/Sapui5Resolver.js index c539c2648..493142558 100644 --- a/lib/ui5Framework/Sapui5Resolver.js +++ b/lib/ui5Framework/Sapui5Resolver.js @@ -114,6 +114,17 @@ class Sapui5Resolver extends AbstractResolver { }); return await installer.fetchPackageVersions({pkgName: DIST_PKG_NAME}); } + + static async fetchTag(tagName, {ui5HomeDir, cwd} = {}) { + const installer = new Installer({ + cwd: cwd ? path.resolve(cwd) : process.cwd(), + ui5HomeDir: + ui5HomeDir ? path.resolve(ui5HomeDir) : + path.join(os.homedir(), ".ui5") + }); + const distTags = await installer.fetchPackageDistTags({pkgName: DIST_PKG_NAME}); + return distTags[tagName]; + } } export default Sapui5Resolver; diff --git a/lib/ui5Framework/npm/Installer.js b/lib/ui5Framework/npm/Installer.js index 8fb4799cc..5f9bd0f63 100644 --- a/lib/ui5Framework/npm/Installer.js +++ b/lib/ui5Framework/npm/Installer.js @@ -57,6 +57,11 @@ class Installer extends AbstractInstaller { return Object.keys(packument.versions); } + async fetchPackageDistTags({pkgName}) { + const packument = await this.getRegistry().requestPackagePackument(pkgName); + return packument["dist-tags"]; + } + async fetchPackageManifest({pkgName, version}) { const targetDir = this._getTargetDirForPackage({pkgName, version}); try {