76 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			76 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | const assert = require('assert-plus'); | ||
|  | const fs = require('fs-extra'); | ||
|  | const path = require('canonical-path'); | ||
|  | const Array_from = require('./arrayFromIterable'); | ||
|  | 
 | ||
|  | module.exports = function apiListDataFileService(log, dartPkgConfigInfo) { | ||
|  | 
 | ||
|  |   const _self = { | ||
|  | 
 | ||
|  |     mainDataFileName: 'api-list.json', | ||
|  |     mainDataFilePath: null, | ||
|  | 
 | ||
|  |     libToEntryMap: null, | ||
|  |     containerToEntryMap: null, | ||
|  |     numExcludedEntries: 0, | ||
|  | 
 | ||
|  |     createDataAndSaveToFile: function (dartDocDataWithExtraProps) { | ||
|  |       const libToEntryMap = _self.libToEntryMap = new Map(); | ||
|  |       const containerToEntryMap = _self.containerToEntryMap = new Map(); | ||
|  |       const re = dartPkgConfigInfo.excludeLibRegExp; | ||
|  | 
 | ||
|  |       // Populate the two maps from dartDocDataWithExtraProps.
 | ||
|  |       dartDocDataWithExtraProps.forEach((e) => { | ||
|  |         // Skip non-preprocessed entries.
 | ||
|  |         if (!e.kind) return true; | ||
|  | 
 | ||
|  |         // Exclude non-public APIs.
 | ||
|  |         if (e.libName.match(re)) { _self.numExcludedEntries++; return true; } | ||
|  | 
 | ||
|  |         let key; | ||
|  |         if (e.kind.startsWith('entry')) { | ||
|  |           // Store library entry info in lib map.
 | ||
|  |           key = e.libName; | ||
|  |           assert.equal(key, e.enclosedByQualifiedName, e); | ||
|  |           _set(libToEntryMap, key, e); | ||
|  |         } else if (e.enclosedBy) { | ||
|  |           assert.notEqual(e.type, 'library'); | ||
|  |           key = e.enclosedByQualifiedName; | ||
|  |         } else { | ||
|  |           assert.equal(e.type, 'library'); | ||
|  |           // Add library "index" page to the library's entries in the general container map,
 | ||
|  |           // but not the lib map which is used to create the main API page index.
 | ||
|  |           key = e.libName; | ||
|  |           _set(containerToEntryMap, key, e); | ||
|  |           // Add the library as an entry to the Angular2 package container:
 | ||
|  |           key = ''; | ||
|  |         } | ||
|  |         _set(containerToEntryMap, key, e); | ||
|  |       }); | ||
|  |       log.info('Excluded', _self.numExcludedEntries, 'library entries (regexp match).'); | ||
|  | 
 | ||
|  |       // Write the library map out as the top-level data file.
 | ||
|  |       _self.mainDataFilePath = path.resolve(path.join(dartPkgConfigInfo.ngIoDartApiDocPath, _self.mainDataFileName)); | ||
|  | 
 | ||
|  |       // The data file needs to be a map of lib names to an array of entries
 | ||
|  |       const fileData = Object.create(null); | ||
|  |       for (let name of Array_from(libToEntryMap.keys()).sort()) { | ||
|  |         fileData[name] = Array_from(libToEntryMap.get(name).values()); | ||
|  |       } | ||
|  |       fs.writeFileSync(_self.mainDataFilePath, JSON.stringify(fileData, null, 2)); | ||
|  |       log.info('Wrote', Object.keys(fileData).length, 'library entries to', _self.mainDataFilePath); | ||
|  |       return fileData; | ||
|  |     }, | ||
|  | 
 | ||
|  |   } | ||
|  |   return _self; | ||
|  | }; | ||
|  | 
 | ||
|  | // Adds e to the map of m[key].
 | ||
|  | function _set(m, key, e) { | ||
|  |   if (!m.has(key)) m.set(key, new Map()); | ||
|  |   const entryMap = m.get(key); | ||
|  |   entryMap.set(e.name, e); | ||
|  | } |