Skip to content

Commit 2cf8738

Browse files
committed
[FEATURE] manifestCreator: i18n section v22
refactoring of dependency resolution logic
1 parent f24a493 commit 2cf8738

File tree

1 file changed

+105
-69
lines changed

1 file changed

+105
-69
lines changed

lib/processors/versionInfoGenerator.js

Lines changed: 105 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -118,92 +118,107 @@ const getManifestPath = (filePath, subPath) => {
118118
const resolveTransitiveDependencies = (libraryInfosMap) => {
119119
const keys = [...libraryInfosMap.keys()];
120120
keys.sort();
121-
const resolvedCache = new Map();
122121
keys.forEach((libName) => { // e.g. sap.ui.documentation
123-
resolve(libName, libraryInfosMap, resolvedCache);
122+
const libraryInfo = libraryInfosMap.get(libName);
123+
libraryInfo.resolve(libraryInfosMap);
124124
});
125125
};
126126

127-
const clone = (obj) => {
128-
return JSON.parse(JSON.stringify(obj));
129-
};
127+
class DependencyInfoObject {
128+
/**
129+
*
130+
* @param {string} name
131+
* @param {boolean} lazy
132+
*/
133+
constructor(name, lazy) {
134+
this.name = name;
135+
this.lazy = lazy;
136+
}
137+
}
130138

131-
const merge = (existingEntry, newLibs) => {
132-
if (existingEntry) {
133-
Object.keys(existingEntry).forEach((libName) => {
134-
if (!existingEntry[libName].lazy && newLibs[libName] && newLibs[libName].lazy) {
135-
delete newLibs[libName].lazy;
136-
}
137-
if (!newLibs[libName]) {
138-
newLibs[libName] = existingEntry[libName];
139-
}
140-
});
139+
class DependencyInfo {
140+
/**
141+
*
142+
* @param {DependencyInfoObject[]} libs
143+
*/
144+
constructor(libs) {
145+
this.libs = libs;
146+
147+
/**
148+
*
149+
* @type {string[]}
150+
*/
151+
this.resolved = [];
152+
/**
153+
*
154+
* @type {DependencyInfoObject[]}
155+
*/
156+
this.libsResolved = [];
157+
this.wasResolved = false;
141158
}
142-
return newLibs;
143-
};
144159

145-
/**
146-
*
147-
* @param {string} libName
148-
* @param {Map<string, DependencyInfos>} libraryInfosMap
149-
* @param {Map<string, DependencyInfos>} alreadyProcessed
150-
* @returns {DependencyInfos} resolved dependencies
151-
*/
152-
const resolve = (libName, libraryInfosMap, alreadyProcessed, isLazy) => {
153-
// check already processed first
154-
if ( alreadyProcessed.has(libName)) {
155-
return alreadyProcessed.get(libName);
160+
isResolved(libName) {
161+
return this.libsResolved.some((libResolved) => {
162+
return libResolved.name === libName;
163+
});
156164
}
157-
const manifestHint = libraryInfosMap.get(libName);
158-
let mergedDependencies = manifestHint;
159-
// cache
160-
alreadyProcessed.set(libName, mergedDependencies);
161-
if (!manifestHint) {
162-
log.error(`no manifest information in dependencies for ${libName}`); // TODO check
163-
alreadyProcessed.set(libName, {});
164-
return {};
165+
166+
addResolvedLibDependency(libName, lazy) {
167+
if (!this.isResolved(libName) || !lazy) {
168+
this.libsResolved.push(new DependencyInfoObject(libName, lazy));
169+
}
165170
}
166-
const keys = Object.keys(manifestHint);
167-
keys.forEach((childLibName) => {
168-
const childResolved = resolve(childLibName, libraryInfosMap, alreadyProcessed, isLazy);
169-
// set a copy of the resolved libraries to avoid modifying it while iterating (recursively)
170-
mergedDependencies = merge(mergedDependencies, clone(childResolved), isLazy);
171-
// TODO add childResolved to resolved
172-
// TODO check cacles
173171

172+
/**
173+
*
174+
* @param {Map<string,DependencyInfo>} dependencyInfoMap
175+
*/
176+
resolve(dependencyInfoMap) {
177+
if (!this.wasResolved) {
178+
this.libs.forEach((depInfoObject) => {
179+
this.addResolvedLibDependency(depInfoObject.name, depInfoObject.lazy);
180+
const dependencyInfo = dependencyInfoMap.get(depInfoObject.name);
181+
dependencyInfo.resolve(dependencyInfoMap);
182+
183+
dependencyInfo.libsResolved.forEach((resolvedLib) => {
184+
this.addResolvedLibDependency(resolvedLib.name, resolvedLib.lazy);
185+
});
186+
});
187+
this.wasResolved = true;
188+
}
189+
}
190+
}
174191

175-
// TODO lib a (lazy) --> all its dependencies must be lazy
176-
// input
177-
// a -> b (lazy) -> c
178-
// output
179-
// a -> b (lazy), c (lazy)
192+
// TODO add childResolved to resolved
193+
// TODO check cacles
180194

181195

182-
// a -> c, b (lazy)
183-
// b -> c (lazy)
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)
184201

185202

186-
// a -> c, b (lazy)
203+
// a -> c, b (lazy)
204+
// b -> c (lazy)
187205

188206

189-
// a -> c (lazy), b (lazy)
190-
// b -> c
207+
// a -> c, b (lazy)
191208

192-
// kette gewinnt lazy --> alle dependencies von einer lazy dep sind auch lazy
193-
// merge gewinnt eager
194209

210+
// a -> c (lazy), b (lazy)
211+
// b -> c
195212

196-
// TODO put this into a classes to better structure the code
197-
// TODO instead of using a "global" map, have a Dependency as a class with a name
198-
// and the functionality to resolve its dependencies
199-
// ManifestHints -> resolve
200-
});
213+
// kette gewinnt lazy --> alle dependencies von einer lazy dep sind auch lazy
214+
// merge gewinnt eager
201215

202-
libraryInfosMap.set(libName, mergedDependencies);
203216

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
204221

205-
return mergedDependencies;
206-
};
207222

208223
/**
209224
* Sorts the keys of a given object
@@ -221,21 +236,41 @@ const sortObjectKeys = (obj) => {
221236
return sortedObject;
222237
};
223238

239+
/**
240+
*
241+
* @param {object} result
242+
* @param {DependencyInfo} libs
243+
*/
224244
const addManifestHints = (result, libs) => {
225-
if (Object.keys(libs).length) {
226-
const sortedLibs = sortObjectKeys(libs);
245+
if (libs.libs.length) {
246+
// const sortedLibs = sortObjectKeys(libs.libs);
247+
const libsObject = {};
248+
libs.libs.forEach((sortedLib) => {
249+
libsObject[sortedLib.name] = {};
250+
if (sortedLib.lazy) {
251+
libsObject[sortedLib.name].lazy = true;
252+
}
253+
});
227254
result.manifestHints = {
228255
dependencies: {
229-
libs: sortedLibs
256+
libs: libsObject
230257
}
231258
};
232259
}
233260
};
234261

262+
const convertToDependencyInfoObjects = (libs) => {
263+
return Object.keys(libs).map((name) => {
264+
const lazy = libs[name].lazy === true;
265+
return new DependencyInfoObject(name, lazy);
266+
});
267+
};
268+
235269
const processLibraryInfo = async (libraryInfo, dependencyInfoMap, embeddedInfoMap) => {
236270
const manifestInfo = await processManifest(libraryInfo.mainManifest);
237271
// gather shallow library information
238-
dependencyInfoMap.set(libraryInfo.name, manifestInfo.libs);
272+
const dependencyInfoObjects = convertToDependencyInfoObjects(manifestInfo.libs);
273+
dependencyInfoMap.set(libraryInfo.name, new DependencyInfo(dependencyInfoObjects));
239274
const embeds = manifestInfo.embeds; // sdk
240275
// filter
241276
const embeddedPaths = embeds.map((embed) => {
@@ -249,7 +284,8 @@ const processLibraryInfo = async (libraryInfo, dependencyInfoMap, embeddedInfoMa
249284
// get all embedded manifests
250285
const embeddedManifestPromises = relevantManifests.map(async (relevantManifest) => {
251286
const result = await processManifest(relevantManifest);
252-
dependencyInfoMap.set(result.id, result.libs);
287+
const dependencyInfoObjects = convertToDependencyInfoObjects(result.libs);
288+
dependencyInfoMap.set(result.id, new DependencyInfo(dependencyInfoObjects));
253289
embeddedInfoMap.set(result.id, {
254290
library: libraryInfo.name
255291
});
@@ -298,7 +334,7 @@ module.exports = async function({options}) {
298334
* }
299335
* }
300336
*
301-
* @type {Map<string, DependencyInfos>}
337+
* @type {Map<string, DependencyInfo>}
302338
*/
303339
const dependencyInfoMap = new Map();
304340
const embeddedInfoMap = new Map();

0 commit comments

Comments
 (0)