Skip to content

Commit 8c26c7a

Browse files
committed
[INTERNAL][WIP] VersionInfo: with manifest infos
improved test sort keys of objects
1 parent e122d8d commit 8c26c7a

File tree

3 files changed

+201
-257
lines changed

3 files changed

+201
-257
lines changed

lib/processors/versionInfoGenerator.js

Lines changed: 67 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,8 @@ const resolve = (libName, libraryInfosMap, resolvedCache) => {
158158
let resolved = manifestHint;
159159
if (!manifestHint) {
160160
log.error(`no manifest information in dependencies for ${libName}`);
161-
resolvedCache.set(libName, resolved);
162-
return resolved;
161+
resolvedCache.set(libName, {});
162+
return {};
163163
}
164164
const keys = Object.keys(manifestHint);
165165
keys.forEach((childLibName) => {
@@ -173,6 +173,56 @@ const resolve = (libName, libraryInfosMap, resolvedCache) => {
173173
return resolved;
174174
};
175175

176+
/**
177+
* Sorts the keys of a given object
178+
*
179+
* @param {object} obj the object
180+
* @returns {{}}
181+
*/
182+
const sortObjectKeys = (obj) => {
183+
const sortedObject = {};
184+
const keys = Object.keys(obj);
185+
keys.sort();
186+
keys.forEach((key) => {
187+
sortedObject[key] = obj[key];
188+
});
189+
return sortedObject;
190+
};
191+
192+
const addManifestHints = (result, libs) => {
193+
if (Object.keys(libs).length) {
194+
const sortedLibs = sortObjectKeys(libs);
195+
result.manifestHints = {
196+
dependencies: {
197+
libs: sortedLibs
198+
}
199+
};
200+
}
201+
};
202+
203+
const processLibraryInfo = async (libraryInfo, dependencyInfoMap, embeddedInfoMap) => {
204+
const manifestInfo = await processManifest(libraryInfo.mainManifest);
205+
dependencyInfoMap.set(libraryInfo.name, manifestInfo.libs);
206+
const embeds = manifestInfo.embeds;
207+
// filter
208+
const embeddedPaths = embeds.map((embed) => {
209+
return getManifestPath(libraryInfo.mainManifest.getPath(), embed);
210+
});
211+
const relevantManifests = libraryInfo.manifestResources.filter((manifestResource) => {
212+
return embeddedPaths.includes(manifestResource.getPath());
213+
});
214+
215+
// get all embedded manifests
216+
const embeddedManifestPromises = relevantManifests.map(async (relevantManifest) => {
217+
const result = await processManifest(relevantManifest);
218+
dependencyInfoMap.set(result.id, result.libs);
219+
embeddedInfoMap.set(result.id, {
220+
library: libraryInfo.name
221+
});
222+
});
223+
224+
await Promise.all(embeddedManifestPromises);
225+
};
176226

177227
/**
178228
* Creates sap-ui-version.json.
@@ -183,7 +233,8 @@ const resolve = (libName, libraryInfosMap, resolvedCache) => {
183233
* @param {object} parameters.options Options
184234
* @param {string} parameters.options.rootProjectName Name of the root project
185235
* @param {string} parameters.options.rootProjectVersion Version of the root project
186-
* @param {LibraryInfo[]} parameters.options.libraryInfos Array of objects representing libraries, e.g. <code>{name: "library.xy", version: "1.0.0", manifests: module:@ui5/fs.Resource[]}</code>
236+
* @param {LibraryInfo[]} parameters.options.libraryInfos Array of objects representing libraries,
237+
* e.g. <code>{name: "library.xy", version: "1.0.0", manifests: module:@ui5/fs.Resource[]}</code>
187238
* @returns {Promise<module:@ui5/fs.Resource[]>} Promise resolving with an array containing the versioninfo resource
188239
*/
189240

@@ -197,11 +248,13 @@ module.exports = async function({options}) {
197248
const components = {};
198249
/**
199250
* @example
200-
* "sap.ui.integration": {
201-
* sap.chart: {
202-
* lazy: true
203-
* },
204-
* sap.f: { },
251+
* {
252+
* "sap.ui.integration": {
253+
* "sap.chart": {
254+
* "lazy": true
255+
* },
256+
* "sap.f": { },
257+
* }
205258
* }
206259
*
207260
* @type {Map<string, DependencyInfos>}
@@ -211,29 +264,7 @@ module.exports = async function({options}) {
211264

212265
// gather all manifestHints
213266
const librariesPromises = options.libraryInfos.map((libraryInfo) => {
214-
// TODO use proper async await!
215-
return processManifest(libraryInfo.mainManifest).then((manifestHint) => {
216-
dependencyInfoMap.set(libraryInfo.name, manifestHint.libs);
217-
return manifestHint.embeds;
218-
}).then((embeds) => {
219-
// filter
220-
const embeddedPaths = embeds.map((embed) => {
221-
return getManifestPath(libraryInfo.mainManifest.getPath(), embed);
222-
});
223-
const relevantManifests = libraryInfo.manifestResources.filter((manifestResource) => {
224-
return embeddedPaths.includes(manifestResource.getPath());
225-
});
226-
227-
// get all embedded manifests
228-
return Promise.all(relevantManifests.map((relevantManifest) => {
229-
return processManifest(relevantManifest).then((result) => {
230-
dependencyInfoMap.set(result.id, result.libs);
231-
embeddedInfoMap.set(result.id, {
232-
library: libraryInfo.name
233-
});
234-
});
235-
}));
236-
});
267+
return processLibraryInfo(libraryInfo, dependencyInfoMap, embeddedInfoMap);
237268
});
238269

239270
await Promise.all(librariesPromises);
@@ -251,28 +282,17 @@ module.exports = async function({options}) {
251282
};
252283

253284
const libs = dependencyInfoMap.get(libraryInfo.name);
254-
if (Object.keys(libs).length) {
255-
result.manifestHints = {
256-
dependencies: {
257-
libs: libs
258-
}
259-
};
260-
}
285+
addManifestHints(result, libs);
261286
return result;
262287
});
263288

264-
// TODO sort!
289+
// sort keys
265290
embeddedInfoMap.forEach((embeddedInfo, libName) => {
266291
components[libName] = embeddedInfo;
267292
const libs = dependencyInfoMap.get(libName);
268-
if (libs && Object.keys(libs).length) {
269-
components[libName].manifestHints = {
270-
dependencies: {
271-
libs: libs
272-
}
273-
};
274-
}
293+
addManifestHints(components[libName], libs);
275294
});
295+
const sortedComponents = sortObjectKeys(components);
276296

277297
// sort libraries alphabetically
278298
libraries.sort((a, b) => {
@@ -286,7 +306,7 @@ module.exports = async function({options}) {
286306
scmRevision: "", // TODO: insert current application scm revision here
287307
// gav: "", // TODO: insert current application id + version here
288308
libraries,
289-
components
309+
components: sortedComponents
290310
};
291311

292312
return [resourceFactory.createResource({

lib/tasks/generateVersionInfo.js

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,16 @@ const MANIFEST_JSON = "manifest.json";
1212
* @param {module:@ui5/fs.AbstractReader} parameters.dependencies Reader or Collection to read dependency files
1313
* @param {object} parameters.options Options
1414
* @param {string} parameters.options.pattern Glob pattern for .library resources
15-
* @param {string} parameters.options.namespace Namespace of the project
1615
* @param {object} parameters.options.rootProject DuplexCollection to read and write files
1716
* @returns {Promise<undefined>} Promise resolving with <code>undefined</code> once data has been written
1817
*/
19-
module.exports = async ({workspace, dependencies, options: {rootProject, pattern, namespace}}) => {
18+
module.exports = async ({workspace, dependencies, options: {rootProject, pattern}}) => {
2019
const resources = await dependencies.byGlob(pattern);
2120

22-
// app always builds all dependencies -> therefore glob all manifest.json
23-
// build with --all should not use the version-info.json
24-
// logic needs to be adjusted once selective dependencies are built
25-
// TODO: transient resources (not part of the build result) ( -> skipped for now)
26-
// exclude task if not build --all
27-
2821
const libraryInfosPromises = resources.map((dotLibResource) => {
2922
const namespace = dotLibResource._project.metadata.namespace;
30-
// TODO favor manifest.json over .library (check first manifest.json then as fallback .library)
31-
// long-term goal: get rid of .library files
32-
// TODO: compare the two
33-
// use /**/ for nested manifests
34-
// use /sap.app/embeds
23+
// pass all required resources to the processor
24+
// the processor will then filter
3525
return dependencies.byGlob(`/resources/${namespace}/**/${MANIFEST_JSON}`).then((manifestResources) => {
3626
const mainManifest = manifestResources.find((manifestResource) => {
3727
return manifestResource.getPath() === `/resources/${namespace}/${MANIFEST_JSON}`;

0 commit comments

Comments
 (0)