11'use strict' ;
22
3- var _ = require ( 'lodash' ) ;
3+ var exec = require ( 'shelljs' ) . exec ;
4+ var semver = require ( 'semver' ) ;
5+
6+ var currentVersion = require ( '../../../build/version.json' ) ;
47
58/**
69 * @dgProcessor generateVersionDocProcessor
@@ -12,23 +15,93 @@ module.exports = function generateVersionDocProcessor(gitData) {
1215 return {
1316 $runAfter : [ 'generatePagesDataProcessor' ] ,
1417 $runBefore : [ 'rendering-docs' ] ,
18+ blacklist : [ '1.3.4-build.3588' ] ,
1519 $process : function ( docs ) {
1620
17- var versionDoc = {
21+ var blacklist = this . blacklist ;
22+ var output = exec ( 'npm info angular versions --json' , { silent : true } ) . stdout ;
23+ var versions = processAllVersionsResponse ( JSON . parse ( output ) ) ;
24+
25+ docs . push ( {
26+ docType : 'version-data' ,
27+ id : 'version-data' ,
28+ template : 'angular-service.template.js' ,
29+ outputPath : 'js/version-data.js' ,
30+ ngModuleName : 'versionData' ,
31+ serviceName : 'NG_VERSION' ,
32+ serviceValue : currentVersion
33+ } ) ;
34+
35+ docs . push ( {
1836 docType : 'versions-data' ,
1937 id : 'versions-data' ,
20- template : 'versions-data .template.js' ,
38+ template : 'angular-service .template.js' ,
2139 outputPath : 'js/versions-data.js' ,
22- currentVersion : gitData . version
23- } ;
40+ ngModuleName : 'versionsData' ,
41+ serviceName : 'NG_VERSIONS' ,
42+ serviceValue : versions
43+ } ) ;
44+
45+
46+ function processAllVersionsResponse ( versions ) {
47+
48+ var latestMap = { } ;
49+
50+ versions = versions
51+ . filter ( function ( versionStr ) {
52+ return blacklist . indexOf ( versionStr ) === - 1 ;
53+ } )
54+ . map ( function ( versionStr ) {
55+ var version = semver . parse ( versionStr ) ;
56+ if ( version ) {
57+ var key = version . major + '.' + version . minor ;
58+ var latest = latestMap [ key ] ;
59+ if ( ! latest || version . compare ( latest ) > 0 ) {
60+ latestMap [ key ] = version ;
61+ }
62+ }
63+ return version ;
64+ } )
65+ . filter ( function ( version ) {
66+ return version && version . major > 0 ;
67+ } )
68+ . map ( function ( version ) {
69+ return makeOption ( version ) ;
70+ } )
71+ . reverse ( ) ;
72+
73+ var latest = sortObject ( latestMap , reverse ( semver . compare ) ) . map ( function ( version ) { return makeOption ( version , 'Latest' ) ; } ) ;
74+
75+ return [ makeOption ( { version : 'snapshot' } , 'Latest' , 'master' ) ]
76+ . concat ( latest )
77+ . concat ( versions ) ;
78+ }
79+
80+ function makeOption ( version , group , label ) {
81+ return {
82+ version : version ,
83+ label : label || 'v' + version . raw ,
84+ group : group || 'v' + version . major + '.' + version . minor ,
85+ docsUrl : createDocsUrl ( version )
86+ } ;
87+ }
88+
89+ function createDocsUrl ( version ) {
90+ var url = 'https://code.angularjs.org/' + version . version + '/docs' ;
91+ // Versions before 1.0.2 had a different docs folder name
92+ if ( version . major === 1 && version . minor === 0 && version . patch < 2 ) {
93+ url += '-' + version . version ;
94+ }
95+ return url ;
96+ }
2497
25- versionDoc . versions = _ ( gitData . versions )
26- . filter ( function ( version ) { return version . major > 0 ; } )
27- . push ( gitData . version )
28- . reverse ( )
29- . value ( ) ;
98+ function reverse ( fn ) {
99+ return function ( left , right ) { return - fn ( left , right ) ; } ;
100+ }
30101
31- docs . push ( versionDoc ) ;
102+ function sortObject ( obj , cmp ) {
103+ return Object . keys ( obj ) . map ( function ( key ) { return obj [ key ] ; } ) . sort ( cmp ) ;
104+ }
32105 }
33106 } ;
34107} ;
0 commit comments