11'use strict' ;
22
3- var _ = require ( 'lodash' ) ;
3+ var exec = require ( 'shelljs' ) . exec ;
4+ var semver = require ( 'semver' ) ;
45
56/**
67 * @dgProcessor generateVersionDocProcessor
@@ -12,23 +13,96 @@ module.exports = function generateVersionDocProcessor(gitData) {
1213 return {
1314 $runAfter : [ 'generatePagesDataProcessor' ] ,
1415 $runBefore : [ 'rendering-docs' ] ,
16+ // the blacklist is to remove rogue builds that are in npm but not on code.angularjs.org
17+ blacklist : [ '1.3.4-build.3588' ] ,
1518 $process : function ( docs ) {
1619
17- var versionDoc = {
18- docType : 'versions-data' ,
19- id : 'versions-data' ,
20- template : 'versions-data.template.js' ,
21- outputPath : 'js/versions-data.js' ,
22- currentVersion : gitData . version
23- } ;
24-
25- versionDoc . versions = _ ( gitData . versions )
26- . filter ( function ( version ) { return version . major > 0 ; } )
27- . push ( gitData . version )
28- . reverse ( )
29- . value ( ) ;
30-
31- docs . push ( versionDoc ) ;
20+ var blacklist = this . blacklist ;
21+ var currentVersion = require ( '../../../build/version.json' ) ;
22+ var output = exec ( 'npm info angular versions --json' , { silent : true } ) . stdout ;
23+ var allVersions = processAllVersionsResponse ( JSON . parse ( output ) ) ;
24+
25+ docs . push ( {
26+ docType : 'current-version-data' ,
27+ id : 'current-version-data' ,
28+ template : 'angular-service.template.js' ,
29+ outputPath : 'js/current-version-data.js' ,
30+ ngModuleName : 'currentVersionData' ,
31+ serviceName : 'CURRENT_NG_VERSION' ,
32+ serviceValue : currentVersion
33+ } ) ;
34+
35+ docs . push ( {
36+ docType : 'allversions-data' ,
37+ id : 'allversions-data' ,
38+ template : 'angular-service.template.js' ,
39+ outputPath : 'js/all-versions-data.js' ,
40+ ngModuleName : 'allVersionsData' ,
41+ serviceName : 'ALL_NG_VERSIONS' ,
42+ serviceValue : allVersions
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+ return semver . parse ( versionStr ) ;
56+ } )
57+ . filter ( function ( version ) {
58+ return version && version . major > 0 ;
59+ } )
60+ . map ( function ( version ) {
61+ var key = version . major + '.' + version . minor ;
62+ var latest = latestMap [ key ] ;
63+ if ( ! latest || version . compare ( latest ) > 0 ) {
64+ latestMap [ key ] = version ;
65+ }
66+ return version ;
67+ } )
68+ . map ( function ( version ) {
69+ return makeOption ( version ) ;
70+ } )
71+ . reverse ( ) ;
72+
73+ var latest = sortObject ( latestMap , reverse ( semver . compare ) )
74+ . map ( function ( version ) { return makeOption ( version , 'Latest' ) ; } ) ;
75+
76+ return [ makeOption ( { version : 'snapshot' } , 'Latest' , 'master' ) ]
77+ . concat ( latest )
78+ . concat ( versions ) ;
79+ }
80+
81+ function makeOption ( version , group , label ) {
82+ return {
83+ version : version ,
84+ label : label || 'v' + version . raw ,
85+ group : group || 'v' + version . major + '.' + version . minor ,
86+ docsUrl : createDocsUrl ( version )
87+ } ;
88+ }
89+
90+ function createDocsUrl ( version ) {
91+ var url = 'https://code.angularjs.org/' + version . version + '/docs' ;
92+ // Versions before 1.0.2 had a different docs folder name
93+ if ( version . major === 1 && version . minor === 0 && version . patch < 2 ) {
94+ url += '-' + version . version ;
95+ }
96+ return url ;
97+ }
98+
99+ function reverse ( fn ) {
100+ return function ( left , right ) { return - fn ( left , right ) ; } ;
101+ }
102+
103+ function sortObject ( obj , cmp ) {
104+ return Object . keys ( obj ) . map ( function ( key ) { return obj [ key ] ; } ) . sort ( cmp ) ;
105+ }
32106 }
33107 } ;
34108} ;
0 commit comments