Skip to content

Commit 3d2b6cc

Browse files
committed
[INTERNAL] ui5framework resolvers: Add resolveVersion/getLibraryMetadata
1 parent 6e1bbf4 commit 3d2b6cc

File tree

11 files changed

+461
-37
lines changed

11 files changed

+461
-37
lines changed

lib/ui5Framework/AbstractResolver.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
const path = require("path");
22
const log = require("@ui5/logger").getLogger("ui5Framework:AbstractResolver");
3+
const semver = require("semver");
4+
5+
const versionRegExp = /^(0|[1-9]\d*)\.(0|[1-9]\d*)(?:\.(0|[1-9]\d*))?$/;
36

47
/**
58
* Abstract Resolver
@@ -151,10 +154,38 @@ class AbstractResolver {
151154
};
152155
}
153156

157+
/**
158+
*
159+
* @param {string} version
160+
* @param {Object} options
161+
*/
162+
static async resolveVersion(version, {ui5HomeDir, cwd} = {}) {
163+
let spec;
164+
if (version === "latest") {
165+
spec = "*";
166+
} else if (versionRegExp.test(version)) {
167+
spec = version;
168+
} else {
169+
throw new Error(`Framework version specifier "${version}" is incorrect or not supported`);
170+
}
171+
const versions = await this.fetchAllVersions({ui5HomeDir, cwd});
172+
const resolvedVersion = semver.maxSatisfying(versions, spec);
173+
if (!resolvedVersion) {
174+
throw new Error(`Could not resolve framework version ${version}`);
175+
}
176+
return resolvedVersion;
177+
}
178+
154179
// To be implemented by resolver
180+
async getLibraryMetadata(libraryName) {
181+
throw new Error("AbstractResolver: getLibraryMetadata must be implemented!");
182+
}
155183
async handleLibrary(libraryName) {
156184
throw new Error("AbstractResolver: handleLibrary must be implemented!");
157185
}
186+
static fetchAllVersions(options) {
187+
throw new Error("AbstractResolver: static fetchAllVersions must be implemented!");
188+
}
158189
}
159190

160191
module.exports = AbstractResolver;

lib/ui5Framework/Openui5Resolver.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
const path = require("path");
2+
13
const AbstractResolver = require("./AbstractResolver");
24
const Installer = require("./npm/Installer");
35

6+
const OPENUI5_CORE_PACKAGE = "@openui5/sap.ui.core";
7+
8+
49
/**
510
* Resolver for the OpenUI5 framework
611
*
@@ -30,7 +35,7 @@ class Openui5Resolver extends AbstractResolver {
3035
static _getLibaryName(pkgName) {
3136
return pkgName.replace(/^@openui5\//, "");
3237
}
33-
_getLibraryMetadata(libraryName) {
38+
getLibraryMetadata(libraryName) {
3439
if (!this._loadLibraryMetadata[libraryName]) {
3540
this._loadLibraryMetadata[libraryName] = Promise.resolve().then(async () => {
3641
// Trigger manifest request to gather transitive dependencies
@@ -64,14 +69,23 @@ class Openui5Resolver extends AbstractResolver {
6469
const pkgName = Openui5Resolver._getNpmPackageName(libraryName);
6570
return {
6671
// Trigger metadata request
67-
metadata: this._getLibraryMetadata(libraryName),
72+
metadata: this.getLibraryMetadata(libraryName),
6873
// Also trigger installation of package
6974
install: this._installer.installPackage({
7075
pkgName,
7176
version: this._version
7277
})
7378
};
7479
}
80+
static async fetchAllVersions({ui5HomeDir, cwd} = {}) {
81+
const installer = new Installer({
82+
cwd: cwd ? path.resolve(cwd) : process.cwd(),
83+
ui5HomeDir:
84+
ui5HomeDir ? path.resolve(ui5HomeDir) :
85+
path.join(require("os").homedir(), ".ui5")
86+
});
87+
return await installer.fetchPackageVersions({pkgName: OPENUI5_CORE_PACKAGE});
88+
}
7589
}
7690

7791
module.exports = Openui5Resolver;

lib/ui5Framework/Sapui5Resolver.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,16 @@ class Sapui5Resolver extends AbstractResolver {
4545
}
4646
return this._loadDistMetadata;
4747
}
48-
async handleLibrary(libraryName) {
48+
async getLibraryMetadata(libraryName) {
4949
const distMetadata = await this.loadDistMetadata();
5050
const metadata = distMetadata.libraries[libraryName];
5151
if (!metadata) {
5252
throw new Error(`Could not find library "${libraryName}"`);
5353
}
54+
return metadata;
55+
}
56+
async handleLibrary(libraryName) {
57+
const metadata = await this.getLibraryMetadata(libraryName);
5458

5559
return {
5660
metadata: Promise.resolve({
@@ -66,6 +70,15 @@ class Sapui5Resolver extends AbstractResolver {
6670
})
6771
};
6872
}
73+
static async fetchAllVersions({ui5HomeDir, cwd} = {}) {
74+
const installer = new Installer({
75+
cwd: cwd ? path.resolve(cwd) : process.cwd(),
76+
ui5HomeDir:
77+
ui5HomeDir ? path.resolve(ui5HomeDir) :
78+
path.join(require("os").homedir(), ".ui5")
79+
});
80+
return await installer.fetchPackageVersions({pkgName: DIST_PKG_NAME});
81+
}
6982
}
7083

7184
module.exports = Sapui5Resolver;

lib/ui5Framework/npm/Installer.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ class Installer {
3131
return JSON.parse(await readFile(jsonPath, {encoding: "utf8"}));
3232
}
3333

34+
async fetchPackageVersions({pkgName}) {
35+
const packument = await this._registry.requestPackagePackument(pkgName);
36+
return Object.keys(packument.versions);
37+
}
38+
3439
async fetchPackageManifest({pkgName, version}) {
3540
const targetDir = this._getTargetDirForPackage({pkgName, version});
3641
try {

lib/ui5Framework/npm/Registry.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ class Registry {
1313
this._cwd = cwd;
1414
this._cacheDir = cacheDir;
1515
}
16+
requestPackagePackument(pkgName) {
17+
return this._pacote.packument(pkgName, this._getPacoteOptions());
18+
}
1619
requestPackageManifest(pkgName, version) {
1720
return this._pacote.manifest(`${pkgName}@${version}`, this._getPacoteOptions());
1821
}

package-lock.json

Lines changed: 26 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@
115115
"read-pkg": "^5.2.0",
116116
"read-pkg-up": "^7.0.1",
117117
"resolve": "^1.15.1",
118+
"semver": "^7.1.3",
118119
"string.prototype.matchall": "^4.0.2"
119120
},
120121
"devDependencies": {

0 commit comments

Comments
 (0)