1
1
'use strict' ;
2
2
3
- var _ = require ( 'lodash' ) ;
3
+ var exec = require ( 'shelljs' ) . exec ;
4
+ var semver = require ( 'semver' ) ;
4
5
5
6
/**
6
7
* @dgProcessor generateVersionDocProcessor
@@ -12,23 +13,96 @@ module.exports = function generateVersionDocProcessor(gitData) {
12
13
return {
13
14
$runAfter : [ 'generatePagesDataProcessor' ] ,
14
15
$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' ] ,
15
18
$process : function ( docs ) {
16
19
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
+ }
32
106
}
33
107
} ;
34
108
} ;
0 commit comments