angular-cn/tools/api-builder/dart-package/services/preprocessDartDocData.js

81 lines
2.9 KiB
JavaScript

'use strict';
const assert = require('assert-plus');
const path = require('canonical-path');
const fs = require('fs-extra');
module.exports = function preprocessDartDocData(log, dartPkgConfigInfo) {
const _self = {
entryMap: null,
preprocess: function (dartDocData) {
// List of API entities
let entryMap = _self.entryMap = new Map(); // used to remove duplicates
let numDuplicates = 0;
dartDocData
.forEach((e) => {
if (entryMap.has(e.href)) {
log.debug('Dartdoc preprocessor: duplicate entry for', e.href);
numDuplicates++;
return true;
}
// Sample entry (note that enclosedBy is optional):
// {
// "name": "Pipe",
// "qualifiedName": "angular2.core.Pipe",
// "href": "angular2.core/Pipe-class.html",
// "type": "class",
// "enclosedBy": {
// "name": "angular2.core",
// "type": "library"
// }
// }
// Save original type property since it will be overridden.
e.origDartDocType = e.type;
const name = e.name;
const qualifiedName = e.qualifiedName;
const matches = e.href.match(/-([a-z]+)\.html/);
let type = matches ? (e.typeFromHref = matches[1]) : e.type;
// Conform to TS type names for now.
if (type === 'constant') type = 'let';
let libName;
e.enclosedByQualifiedName = path.dirname(e.href);
if (e.enclosedBy && e.enclosedBy.type === 'library') {
e.kind = 'entry-dart-api';
libName = e.enclosedBy.name;
assert.equal(libName, e.enclosedByQualifiedName, e.kind);
} else if (e.origDartDocType === 'library') {
e.kind = 'library-dart-api';
libName = e.name;
e.enclosedByQualifiedName = ''; // Dart libraries can only be at the top level.
} else {
e.kind = 'subentry-dart-api';
libName = e.enclosedByQualifiedName.split('/')[0];
assert.equal(path.join(libName, e.enclosedBy.name), e.enclosedByQualifiedName, e);
}
e.docType = type;
e.libName = libName;
e.path = e.href;
e.title = name;
e.layout = false; // To prevent public/docs/_layout.jade from be applied to Dart API pages
// Also set above:
// e.kind: one of {library,entry,subentry}-dart-api
// e.enclosedByQualifiedName
// e.origDartDocType
// e.typeFromHref
Object.freeze(e);
entryMap.set(e.path, e);
log.silly('Preproc API entity =', JSON.stringify(e, null, 2));
});
// There shouldn't be duplicates (hence the warning), but there are:
// https://github.com/dart-lang/dartdoc/issues/1197
if (numDuplicates) log.warn('Number of duplicate dartdoc entries', numDuplicates);
},
};
return _self;
};