Skip to content

Commit d2e32e8

Browse files
committed
[INTERNAL][WIP] VersionInfo: with manifest infos
improved test sort keys of objects
1 parent 7618c57 commit d2e32e8

File tree

3 files changed

+201
-258
lines changed

3 files changed

+201
-258
lines changed

lib/processors/versionInfoGenerator.js

Lines changed: 67 additions & 48 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,8 +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 {Array} parameters.options.libraryInfos Array of objects representing libraries,
187-
* e.g. <code>{name: "library.xy", version: "1.0.0"}</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>
188238
* @returns {Promise<module:@ui5/fs.Resource[]>} Promise resolving with an array containing the versioninfo resource
189239
*/
190240

@@ -198,11 +248,13 @@ module.exports = async function({options}) {
198248
const components = {};
199249
/**
200250
* @example
201-
* "sap.ui.integration": {
202-
* sap.chart: {
203-
* lazy: true
204-
* },
205-
* sap.f: { },
251+
* {
252+
* "sap.ui.integration": {
253+
* "sap.chart": {
254+
* "lazy": true
255+
* },
256+
* "sap.f": { },
257+
* }
206258
* }
207259
*
208260
* @type {Map<string, DependencyInfos>}
@@ -212,29 +264,7 @@ module.exports = async function({options}) {
212264

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

240270
await Promise.all(librariesPromises);
@@ -252,28 +282,17 @@ module.exports = async function({options}) {
252282
};
253283

254284
const libs = dependencyInfoMap.get(libraryInfo.name);
255-
if (Object.keys(libs).length) {
256-
result.manifestHints = {
257-
dependencies: {
258-
libs: libs
259-
}
260-
};
261-
}
285+
addManifestHints(result, libs);
262286
return result;
263287
});
264288

265-
// TODO sort!
289+
// sort keys
266290
embeddedInfoMap.forEach((embeddedInfo, libName) => {
267291
components[libName] = embeddedInfo;
268292
const libs = dependencyInfoMap.get(libName);
269-
if (libs && Object.keys(libs).length) {
270-
components[libName].manifestHints = {
271-
dependencies: {
272-
libs: libs
273-
}
274-
};
275-
}
293+
addManifestHints(components[libName], libs);
276294
});
295+
const sortedComponents = sortObjectKeys(components);
277296

278297
// sort libraries alphabetically
279298
libraries.sort((a, b) => {
@@ -287,7 +306,7 @@ module.exports = async function({options}) {
287306
scmRevision: "", // TODO: insert current application scm revision here
288307
// gav: "", // TODO: insert current application id + version here
289308
libraries,
290-
components
309+
components: sortedComponents
291310
};
292311

293312
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)