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);
|
||
|
}
|