@@ -118,92 +118,107 @@ const getManifestPath = (filePath, subPath) => {
118118const 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+ */
224244const 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+
235269const 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