1+ const log = require ( "@ui5/logger" ) . getLogger ( "builder:processors:versionInfogenerator" ) ;
12const resourceFactory = require ( "@ui5/fs" ) . resourceFactory ;
3+ const path = require ( "path" ) ;
24
35function 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 */
2325const 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
8398const 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
119135const 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