Skip to content

Commit bff2bad

Browse files
committed
[INTERNAL][WIP] VersionInfo: with manifest infos
minor adjustments
1 parent 6fb362e commit bff2bad

File tree

1 file changed

+59
-46
lines changed

1 file changed

+59
-46
lines changed

lib/processors/versionInfoGenerator.js

Lines changed: 59 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
const log = require("@ui5/logger").getLogger("builder:processors:versionInfogenerator");
12
const resourceFactory = require("@ui5/fs").resourceFactory;
3+
const path = require("path");
24

35
function pad(v) {
46
return String(v).padStart(2, "0");
@@ -18,52 +20,66 @@ function getTimestamp() {
1820
/**
1921
*
2022
* @param {module:@ui5/fs.Resource} manifestResource
21-
* @returns {Promise<DependencyInfos>}
23+
* @returns {Promise<ManifestInfos>}
2224
*/
2325
const processManifest = async (manifestResource) => {
2426
const manifestContent = await manifestResource.getString();
2527
const manifestObject = JSON.parse(manifestContent);
26-
// TODO extract manifestHints
27-
const manifestDependencies = manifestObject["sap.ui5"]["dependencies"];
2828
const result = {
2929
embeds: [],
3030
libs: {},
3131
id: undefined
3232
};
33-
if (manifestDependencies) {
34-
Object.keys(manifestDependencies.libs).forEach((libKey) => {
35-
result.libs[libKey] = {};
36-
if (manifestDependencies.libs[libKey].lazy) {
37-
result.libs[libKey].lazy = true;
38-
}
39-
});
33+
34+
// sap.ui5/dependencies is used for the manifestHints
35+
if (manifestObject["sap.ui5"]) {
36+
const manifestDependencies = manifestObject["sap.ui5"]["dependencies"];
37+
if (manifestDependencies) {
38+
Object.keys(manifestDependencies.libs).forEach((libKey) => {
39+
result.libs[libKey] = {};
40+
if (manifestDependencies.libs[libKey].lazy) {
41+
result.libs[libKey].lazy = true;
42+
}
43+
});
44+
}
4045
}
4146

42-
// there for components
43-
const manifestEmbeds = manifestObject["sap.app"]["embeds"];
44-
if (manifestEmbeds) {
45-
result.embeds = manifestEmbeds;
47+
// sap.app/embeds is required for "components" in sap-ui-version.json
48+
if (manifestObject["sap.app"]) {
49+
const manifestEmbeds = manifestObject["sap.app"]["embeds"];
50+
if (manifestEmbeds) {
51+
result.embeds = manifestEmbeds;
52+
}
53+
result.id = manifestObject["sap.app"]["id"];
4654
}
47-
result.id = manifestObject["sap.app"]["id"];
4855
return result;
4956
};
5057

58+
/**
59+
* Library Info
60+
*
61+
* @typedef {object<string, object>} DependencyInfos
62+
*/
63+
5164
/**
5265
* Manifest Hint
5366
*
54-
* @public
55-
* @typedef {object} DependencyInfos
56-
* @property {object} libs The library object
57-
* @property {string[]} embeds embedded components
58-
* @property {string} id id
67+
* @typedef {object} ManifestInfos
68+
* @property {DependencyInfos} libs The library object
69+
* @property {string[]} embeds embedded components, e.g. "sub/fold" (only relative path)
70+
* @property {string} id the app id, e.g. "lib.a"
5971
*
6072
*
6173
* @example
6274
* {
63-
* sap.chart: {
64-
* lazy: true
75+
* libs: {
76+
* sap.chart: {
77+
* lazy: true
78+
* },
79+
* sap.f: { },
6580
* },
66-
* sap.f: { },
81+
* id: "lib.a",
82+
* embeds: ["sub"]
6783
* }
6884
*
6985
*/
@@ -72,7 +88,6 @@ const processManifest = async (manifestResource) => {
7288
/**
7389
* Library Info object
7490
*
75-
* @public
7691
* @typedef {object} LibraryInfo
7792
* @property {string} name The library name
7893
* @property {string} version The library version
@@ -82,21 +97,22 @@ const processManifest = async (manifestResource) => {
8297

8398
const getManifestPath = (filePath, subPath) => {
8499
if (filePath.endsWith("manifest.json")) {
85-
return filePath.substr(0, filePath.length - "manifest.json".length) + subPath + "/manifest.json";
100+
const folderPathOfManifest = filePath.substr(0, filePath.length - "manifest.json".length) + subPath;
101+
return path.posix.resolve(folderPathOfManifest + "/manifest.json");
86102
}
87103
return filePath;
88104
};
89105

90106
/**
91107
*
92-
* @param {Map<string, DependencyInfos>} manifestHints
108+
* @param {Map<string, DependencyInfos>} libraryInfosMap
93109
*/
94-
const resolveTransitiveDependencies = (manifestHints) => {
95-
const keys = [...manifestHints.keys()];
110+
const resolveTransitiveDependencies = (libraryInfosMap) => {
111+
const keys = [...libraryInfosMap.keys()];
96112
keys.sort();
97113
const resolvedCache = new Map();
98114
keys.forEach((libName) => {
99-
resolve(libName, manifestHints, resolvedCache);
115+
resolve(libName, libraryInfosMap, resolvedCache);
100116
});
101117
};
102118

@@ -106,22 +122,22 @@ const clone = (obj) => {
106122

107123
/**
108124
*
109-
* @param {Map<string, DependencyInfos>} manifestHints
125+
* @param {Map<string, DependencyInfos>} libraryInfosMap
110126
* @param {string} libName
111127
* @param {object} newObject
112128
*/
113-
const setManifestHints = (manifestHints, libName, newObject) => {
114-
const existingEntry = manifestHints.get(libName);
115-
const newLibs = merge(existingEntry && existingEntry, newObject);
116-
manifestHints.set(libName, newLibs);
129+
const setManifestHints = (libraryInfosMap, libName, newObject) => {
130+
const existingEntry = libraryInfosMap.get(libName);
131+
const newLibs = merge(existingEntry, newObject);
132+
libraryInfosMap.set(libName, newLibs);
117133
};
118134

119135
const merge = (existingEntry, newObject) => {
120136
const newLibs = clone(newObject);
121137
if (existingEntry) {
122138
Object.keys(existingEntry).forEach((libName) => {
123139
if (!existingEntry[libName].lazy && newLibs[libName] && newLibs[libName].lazy) {
124-
newLibs[libName] = {};
140+
delete newLibs[libName].lazy;
125141
}
126142
if (!newLibs[libName]) {
127143
newLibs[libName] = existingEntry[libName];
@@ -134,30 +150,29 @@ const merge = (existingEntry, newObject) => {
134150
/**
135151
*
136152
* @param {string} libName
137-
* @param {Map<string, DependencyInfos>} manifestHints
153+
* @param {Map<string, DependencyInfos>} libraryInfosMap
138154
* @param {Map<string, DependencyInfos>} resolvedCache
139155
* @returns {DependencyInfos} resolved dependencies
140156
*/
141-
const resolve = (libName, manifestHints, resolvedCache) => {
157+
const resolve = (libName, libraryInfosMap, resolvedCache) => {
142158
// check cache first
143159
if ( resolvedCache.has(libName)) {
144160
return resolvedCache.get(libName);
145161
}
146-
const manifestHint = manifestHints.get(libName); // lib.c
147-
// console.log(`:processing: ${libName}`);
162+
const manifestHint = libraryInfosMap.get(libName);
148163
let resolved = {};
149164
if (!manifestHint) {
150-
console.error(`no manifest information in dependencies for ${libName}`);
165+
log.error(`no manifest information in dependencies for ${libName}`);
151166
resolvedCache.set(libName, resolved);
152167
return resolved;
153168
}
154-
const keys = Object.keys(manifestHint); // [lib.b]
169+
const keys = Object.keys(manifestHint);
155170
keys.forEach((childLibName) => {
156-
const childResolved = resolve(childLibName, manifestHints, resolvedCache);
171+
const childResolved = resolve(childLibName, libraryInfosMap, resolvedCache);
157172
resolved = merge(resolved, childResolved);
158173
});
159174
resolved = merge(resolved, manifestHint);
160-
setManifestHints(manifestHints, libName, resolved);
175+
setManifestHints(libraryInfosMap, libName, resolved);
161176
resolvedCache.set(libName, resolved);
162177
return resolved;
163178
};
@@ -213,7 +228,7 @@ module.exports = async function({options}) {
213228
return embeddedPaths.includes(manifestResource.getPath());
214229
});
215230

216-
// get all embeds manifests
231+
// get all embedded manifests
217232
return Promise.all(relevantManifests.map((relevantManifest) => {
218233
return processManifest(relevantManifest).then((result) => {
219234
dependencyInfoMap.set(result.id, result.libs);
@@ -225,8 +240,6 @@ module.exports = async function({options}) {
225240
});
226241
});
227242

228-
// gather embeds' manifest and do the same
229-
230243
await Promise.all(librariesPromises);
231244

232245
// resolve nested dependencies (transitive)

0 commit comments

Comments
 (0)