4099279426
The `indexBy()` method was renamed to `keyBy()` in lodash v4 (see lodash/lodash@b1d52ccd82). This commit updates all usages of `indexBy()` to `keyBy()`.
240 lines
6.2 KiB
JavaScript
240 lines
6.2 KiB
JavaScript
'use strict';
|
|
|
|
var _ = require('lodash');
|
|
var path = require('canonical-path');
|
|
|
|
var AREA_NAMES = {
|
|
api: 'API',
|
|
guide: 'Developer Guide',
|
|
misc: 'Miscellaneous',
|
|
tutorial: 'Tutorial',
|
|
error: 'Error Reference'
|
|
};
|
|
|
|
function getNavGroup(pages, area, pageSorter, pageMapper) {
|
|
|
|
var navItems = _(pages)
|
|
// We don't want the child to include the index page as this is already catered for
|
|
.omit(function(page) { return page.id === 'index'; })
|
|
|
|
// Apply the supplied sorting function
|
|
.sortBy(pageSorter)
|
|
|
|
// Apply the supplied mapping function
|
|
.map(pageMapper)
|
|
|
|
.value();
|
|
|
|
return {
|
|
name: area.name,
|
|
type: 'group',
|
|
href: area.id,
|
|
navItems: navItems
|
|
};
|
|
}
|
|
|
|
|
|
/**
|
|
* @dgProcessor generatePagesDataProcessor
|
|
* @description
|
|
* This processor will create a new doc that will be rendered as a JavaScript file
|
|
* containing meta information about the pages and navigation
|
|
*/
|
|
module.exports = function generatePagesDataProcessor(log) {
|
|
|
|
|
|
var navGroupMappers = {
|
|
api: function(areaPages, area) {
|
|
var navGroups = _(areaPages)
|
|
.filter('module') // We are not interested in docs that are not in a module
|
|
|
|
.groupBy('module')
|
|
|
|
.map(function(modulePages, moduleName) {
|
|
log.debug('moduleName: ' + moduleName);
|
|
var navItems = [];
|
|
var modulePage;
|
|
|
|
_(modulePages)
|
|
|
|
.groupBy('docType')
|
|
|
|
.tap(function(docTypes) {
|
|
log.debug(moduleName, _.keys(docTypes));
|
|
// Extract the module page from the collection
|
|
modulePage = docTypes.module[0];
|
|
delete docTypes.module;
|
|
})
|
|
|
|
.tap(function(docTypes) {
|
|
if (docTypes.input) {
|
|
docTypes.directive = docTypes.directive || [];
|
|
// Combine input docTypes into directive docTypes
|
|
docTypes.directive = docTypes.directive.concat(docTypes.input);
|
|
delete docTypes.input;
|
|
}
|
|
})
|
|
|
|
.forEach(function(sectionPages, sectionName) {
|
|
|
|
sectionPages = _.sortBy(sectionPages, 'name');
|
|
|
|
if (sectionPages.length > 0) {
|
|
// Push a navItem for this section
|
|
navItems.push({
|
|
name: sectionName,
|
|
type: 'section',
|
|
href: path.dirname(sectionPages[0].path)
|
|
});
|
|
|
|
// Push the rest of the sectionPages for this section
|
|
_.forEach(sectionPages, function(sectionPage) {
|
|
|
|
navItems.push({
|
|
name: sectionPage.name,
|
|
href: sectionPage.path,
|
|
type: sectionPage.docType
|
|
});
|
|
|
|
});
|
|
}
|
|
});
|
|
return {
|
|
name: moduleName,
|
|
href: modulePage.path,
|
|
type: 'group',
|
|
navItems: navItems
|
|
};
|
|
})
|
|
.value();
|
|
return navGroups;
|
|
},
|
|
tutorial: function(pages, area) {
|
|
return [getNavGroup(pages, area, 'step', function(page) {
|
|
return {
|
|
name: page.name,
|
|
step: page.step,
|
|
href: page.path,
|
|
type: 'tutorial'
|
|
};
|
|
})];
|
|
},
|
|
error: function(pages, area) {
|
|
return [getNavGroup(pages, area, 'path', function(page) {
|
|
return {
|
|
name: page.name,
|
|
href: page.path,
|
|
type: page.docType === 'errorNamespace' ? 'section' : 'error'
|
|
};
|
|
})];
|
|
},
|
|
pages: function(pages, area) {
|
|
return [getNavGroup(
|
|
pages,
|
|
area,
|
|
function(page) {
|
|
return page.sortOrder || page.path;
|
|
},
|
|
function(page) {
|
|
return {
|
|
name: page.name,
|
|
href: page.path,
|
|
type: 'page'
|
|
};
|
|
}
|
|
)];
|
|
}
|
|
};
|
|
|
|
return {
|
|
$runAfter: ['paths-computed', 'generateKeywordsProcessor'],
|
|
$runBefore: ['rendering-docs'],
|
|
$process: function(docs) {
|
|
|
|
// We are only interested in docs that are in an area
|
|
var pages = _.filter(docs, function(doc) {
|
|
return doc.area;
|
|
});
|
|
|
|
// We are only interested in pages that are not landing pages
|
|
var navPages = _.filter(pages, function(page) {
|
|
return page.docType !== 'componentGroup';
|
|
});
|
|
|
|
// Generate an object collection of pages that is grouped by area e.g.
|
|
// - area "api"
|
|
// - group "ng"
|
|
// - section "directive"
|
|
// - ngApp
|
|
// - ngBind
|
|
// - section "global"
|
|
// - angular.element
|
|
// - angular.bootstrap
|
|
// - section "service"
|
|
// - $compile
|
|
// - group "ngRoute"
|
|
// - section "directive"
|
|
// - ngView
|
|
// - section "service"
|
|
// - $route
|
|
//
|
|
var areas = {};
|
|
_(navPages)
|
|
.groupBy('area')
|
|
.forEach(function(pages, areaId) {
|
|
var area = {
|
|
id: areaId,
|
|
name: AREA_NAMES[areaId]
|
|
};
|
|
areas[areaId] = area;
|
|
|
|
var navGroupMapper = navGroupMappers[area.id] || navGroupMappers['pages'];
|
|
area.navGroups = navGroupMapper(pages, area);
|
|
});
|
|
|
|
docs.push({
|
|
docType: 'nav-data',
|
|
id: 'nav-data',
|
|
template: 'nav-data.template.js',
|
|
outputPath: 'js/nav-data.js',
|
|
areas: areas
|
|
});
|
|
|
|
|
|
|
|
var searchData = _(pages)
|
|
.filter(function(page) {
|
|
return page.searchTerms;
|
|
})
|
|
.map(function(page) {
|
|
return _.extend({ path: page.path }, page.searchTerms);
|
|
})
|
|
.value();
|
|
|
|
docs.push({
|
|
docType: 'json-doc',
|
|
id: 'search-data-json',
|
|
template: 'json-doc.template.json',
|
|
outputPath: 'js/search-data.json',
|
|
data: searchData
|
|
});
|
|
|
|
// Extract a list of basic page information for mapping paths to partials and for client side searching
|
|
var pageData = _(docs)
|
|
.map(function(doc) {
|
|
return _.pick(doc, ['name', 'area', 'path']);
|
|
})
|
|
.keyBy('path')
|
|
.value();
|
|
|
|
docs.push({
|
|
docType: 'pages-data',
|
|
id: 'pages-data',
|
|
template: 'pages-data.template.js',
|
|
outputPath: 'js/pages-data.js',
|
|
pages: pageData
|
|
});
|
|
}
|
|
};
|
|
};
|