Skip to content

Commit 7573b0f

Browse files
committed
[FEATURE] manifestCreator: i18n section v22
fix recursive logic such that lazy property correctly gets interpreted: * dependencies of lazy dependency are also lazy * having the same dependency lazy and non-lazy results in a non-lazy dependency
1 parent 2cf8738 commit 7573b0f

File tree

2 files changed

+576
-575
lines changed

2 files changed

+576
-575
lines changed

lib/processors/versionInfoGenerator.js

Lines changed: 49 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ const resolveTransitiveDependencies = (libraryInfosMap) => {
127127
class DependencyInfoObject {
128128
/**
129129
*
130-
* @param {string} name
130+
* @param {string} name name of the dependency, e.g. sap.ui.documentation
131131
* @param {boolean} lazy
132132
*/
133133
constructor(name, lazy) {
@@ -140,9 +140,11 @@ class DependencyInfo {
140140
/**
141141
*
142142
* @param {DependencyInfoObject[]} libs
143+
* @param {string} name
143144
*/
144-
constructor(libs) {
145+
constructor(libs, name) {
145146
this.libs = libs;
147+
this.name = name;
146148

147149
/**
148150
*
@@ -158,67 +160,60 @@ class DependencyInfo {
158160
}
159161

160162
isResolved(libName) {
161-
return this.libsResolved.some((libResolved) => {
163+
return this.libsResolved.find((libResolved) => {
162164
return libResolved.name === libName;
163165
});
164166
}
165167

168+
/**
169+
*
170+
* @param {string} libName
171+
* @param {boolean} lazy
172+
* @returns {DependencyInfoObject}
173+
*/
166174
addResolvedLibDependency(libName, lazy) {
167-
if (!this.isResolved(libName) || !lazy) {
168-
this.libsResolved.push(new DependencyInfoObject(libName, lazy));
175+
if (log.isLevelEnabled("verbose")) {
176+
log.verbose(`${this.name} add: ${libName}${lazy?" (lazy)":""}`);
177+
}
178+
let alreadyResolved = this.isResolved(libName);
179+
if (!alreadyResolved) {
180+
alreadyResolved = new DependencyInfoObject(libName, lazy);
181+
this.libsResolved.push(alreadyResolved);
182+
} else {
183+
if (!alreadyResolved.lazy || !lazy) {
184+
delete alreadyResolved.lazy;
185+
}
169186
}
187+
return alreadyResolved;
170188
}
171189

172190
/**
173191
*
174192
* @param {Map<string,DependencyInfo>} dependencyInfoMap
193+
* @param {boolean} [lazy]
175194
*/
176-
resolve(dependencyInfoMap) {
177-
if (!this.wasResolved) {
195+
resolve(dependencyInfoMap, lazy) {
196+
if (!this.wasResolved || lazy) {
197+
log.verbose(`resolving ${this.name}`);
178198
this.libs.forEach((depInfoObject) => {
179-
this.addResolvedLibDependency(depInfoObject.name, depInfoObject.lazy);
199+
const dependencyInfoObjectAdded = this.addResolvedLibDependency(depInfoObject.name, depInfoObject.lazy);
180200
const dependencyInfo = dependencyInfoMap.get(depInfoObject.name);
181-
dependencyInfo.resolve(dependencyInfoMap);
201+
dependencyInfo.resolve(dependencyInfoMap, dependencyInfoObjectAdded.lazy);
182202

183203
dependencyInfo.libsResolved.forEach((resolvedLib) => {
184-
this.addResolvedLibDependency(resolvedLib.name, resolvedLib.lazy);
204+
this.addResolvedLibDependency(resolvedLib.name, resolvedLib.lazy || dependencyInfoObjectAdded.lazy);
185205
});
186206
});
187207
this.wasResolved = true;
208+
if (log.isLevelEnabled("verbose")) {
209+
log.verbose(`resolved ${this.name}: ${this.libsResolved.map((lib) => {
210+
return `${this.name}: ${lib.name}${lib.lazy ? " (lazy)" : ""}`;
211+
}).join(", ")}`);
212+
}
188213
}
189214
}
190215
}
191216

192-
// TODO add childResolved to resolved
193-
// TODO check cacles
194-
195-
196-
// TODO lib a (lazy) --> all its dependencies must be lazy
197-
// input
198-
// a -> b (lazy) -> c
199-
// output
200-
// a -> b (lazy), c (lazy)
201-
202-
203-
// a -> c, b (lazy)
204-
// b -> c (lazy)
205-
206-
207-
// a -> c, b (lazy)
208-
209-
210-
// a -> c (lazy), b (lazy)
211-
// b -> c
212-
213-
// kette gewinnt lazy --> alle dependencies von einer lazy dep sind auch lazy
214-
// merge gewinnt eager
215-
216-
217-
// TODO put this into a classes to better structure the code
218-
// TODO instead of using a "global" map, have a Dependency as a class with a name
219-
// and the functionality to resolve its dependencies
220-
// ManifestHints -> resolve
221-
222217

223218
/**
224219
* Sorts the keys of a given object
@@ -239,13 +234,13 @@ const sortObjectKeys = (obj) => {
239234
/**
240235
*
241236
* @param {object} result
242-
* @param {DependencyInfo} libs
237+
* @param {DependencyInfo} dependencyInfo
243238
*/
244-
const addManifestHints = (result, libs) => {
245-
if (libs.libs.length) {
239+
const addManifestHints = (result, dependencyInfo) => {
240+
if (dependencyInfo && dependencyInfo.libs.length) {
246241
// const sortedLibs = sortObjectKeys(libs.libs);
247242
const libsObject = {};
248-
libs.libs.forEach((sortedLib) => {
243+
dependencyInfo.libsResolved.forEach((sortedLib) => {
249244
libsObject[sortedLib.name] = {};
250245
if (sortedLib.lazy) {
251246
libsObject[sortedLib.name].lazy = true;
@@ -267,10 +262,14 @@ const convertToDependencyInfoObjects = (libs) => {
267262
};
268263

269264
const processLibraryInfo = async (libraryInfo, dependencyInfoMap, embeddedInfoMap) => {
265+
if (!libraryInfo.mainManifest) {
266+
log.error(`library manifest not found for ${libraryInfo.name}`);
267+
return;
268+
}
270269
const manifestInfo = await processManifest(libraryInfo.mainManifest);
271270
// gather shallow library information
272271
const dependencyInfoObjects = convertToDependencyInfoObjects(manifestInfo.libs);
273-
dependencyInfoMap.set(libraryInfo.name, new DependencyInfo(dependencyInfoObjects));
272+
dependencyInfoMap.set(libraryInfo.name, new DependencyInfo(dependencyInfoObjects, libraryInfo.name));
274273
const embeds = manifestInfo.embeds; // sdk
275274
// filter
276275
const embeddedPaths = embeds.map((embed) => {
@@ -285,7 +284,7 @@ const processLibraryInfo = async (libraryInfo, dependencyInfoMap, embeddedInfoMa
285284
const embeddedManifestPromises = relevantManifests.map(async (relevantManifest) => {
286285
const result = await processManifest(relevantManifest);
287286
const dependencyInfoObjects = convertToDependencyInfoObjects(result.libs);
288-
dependencyInfoMap.set(result.id, new DependencyInfo(dependencyInfoObjects));
287+
dependencyInfoMap.set(result.id, new DependencyInfo(dependencyInfoObjects, result.id));
289288
embeddedInfoMap.set(result.id, {
290289
library: libraryInfo.name
291290
});
@@ -382,9 +381,11 @@ module.exports = async function({options}) {
382381
buildTimestamp: buildTimestamp,
383382
scmRevision: "", // TODO: insert current application scm revision here
384383
// gav: "", // TODO: insert current application id + version here
385-
libraries,
386-
components: sortedComponents
384+
libraries
387385
};
386+
if (Object.keys(sortedComponents).length) {
387+
versionJson.components = sortedComponents;
388+
}
388389

389390
return [resourceFactory.createResource({
390391
path: "/resources/sap-ui-version.json",

0 commit comments

Comments
 (0)