@@ -118,92 +118,107 @@ const getManifestPath = (filePath, subPath) => {
118
118
const resolveTransitiveDependencies = ( libraryInfosMap ) => {
119
119
const keys = [ ...libraryInfosMap . keys ( ) ] ;
120
120
keys . sort ( ) ;
121
- const resolvedCache = new Map ( ) ;
122
121
keys . forEach ( ( libName ) => { // e.g. sap.ui.documentation
123
- resolve ( libName , libraryInfosMap , resolvedCache ) ;
122
+ const libraryInfo = libraryInfosMap . get ( libName ) ;
123
+ libraryInfo . resolve ( libraryInfosMap ) ;
124
124
} ) ;
125
125
} ;
126
126
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
+ }
130
138
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 ;
141
158
}
142
- return newLibs ;
143
- } ;
144
159
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
+ } ) ;
156
164
}
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
+ }
165
170
}
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
173
171
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
+ }
174
191
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
180
194
181
195
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)
184
201
185
202
186
- // a -> c, b (lazy)
203
+ // a -> c, b (lazy)
204
+ // b -> c (lazy)
187
205
188
206
189
- // a -> c (lazy), b (lazy)
190
- // b -> c
207
+ // a -> c, b (lazy)
191
208
192
- // kette gewinnt lazy --> alle dependencies von einer lazy dep sind auch lazy
193
- // merge gewinnt eager
194
209
210
+ // a -> c (lazy), b (lazy)
211
+ // b -> c
195
212
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
201
215
202
- libraryInfosMap . set ( libName , mergedDependencies ) ;
203
216
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
204
221
205
- return mergedDependencies ;
206
- } ;
207
222
208
223
/**
209
224
* Sorts the keys of a given object
@@ -221,21 +236,41 @@ const sortObjectKeys = (obj) => {
221
236
return sortedObject ;
222
237
} ;
223
238
239
+ /**
240
+ *
241
+ * @param {object } result
242
+ * @param {DependencyInfo } libs
243
+ */
224
244
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
+ } ) ;
227
254
result . manifestHints = {
228
255
dependencies : {
229
- libs : sortedLibs
256
+ libs : libsObject
230
257
}
231
258
} ;
232
259
}
233
260
} ;
234
261
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
+
235
269
const processLibraryInfo = async ( libraryInfo , dependencyInfoMap , embeddedInfoMap ) => {
236
270
const manifestInfo = await processManifest ( libraryInfo . mainManifest ) ;
237
271
// 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 ) ) ;
239
274
const embeds = manifestInfo . embeds ; // sdk
240
275
// filter
241
276
const embeddedPaths = embeds . map ( ( embed ) => {
@@ -249,7 +284,8 @@ const processLibraryInfo = async (libraryInfo, dependencyInfoMap, embeddedInfoMa
249
284
// get all embedded manifests
250
285
const embeddedManifestPromises = relevantManifests . map ( async ( relevantManifest ) => {
251
286
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 ) ) ;
253
289
embeddedInfoMap . set ( result . id , {
254
290
library : libraryInfo . name
255
291
} ) ;
@@ -298,7 +334,7 @@ module.exports = async function({options}) {
298
334
* }
299
335
* }
300
336
*
301
- * @type {Map<string, DependencyInfos > }
337
+ * @type {Map<string, DependencyInfo > }
302
338
*/
303
339
const dependencyInfoMap = new Map ( ) ;
304
340
const embeddedInfoMap = new Map ( ) ;
0 commit comments