81 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			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;
							 | 
						||
| 
								 | 
							
								};
							 |