11/**
22 * Copyright (c) 2013-present, Facebook, Inc.
3- * All rights reserved.
43 *
5- * This source code is licensed under the BSD-style license found in the
6- * LICENSE file in the root directory of this source tree. An additional grant
7- * of patent rights can be found in the PATENTS file in the same directory.
4+ * This source code is licensed under the MIT license found in the
5+ * LICENSE file in the root directory of this source tree.
86 */
97
108'use strict' ;
119
12- const { markdown} = require ( 'danger' ) ;
10+ const { markdown, danger } = require ( 'danger' ) ;
1311const fetch = require ( 'node-fetch' ) ;
1412
15- const {
16- resultsHeaders,
17- generateResultsArray,
18- } = require ( './scripts/rollup/stats' ) ;
13+ const { generateResultsArray} = require ( './scripts/rollup/stats' ) ;
1914const currentBuildResults = require ( './scripts/rollup/results.json' ) ;
2015
2116/**
@@ -33,20 +28,120 @@ function generateMDTable(headers, body) {
3328 return tableHeaders . join ( '\n' ) + '\n' + tablebody . join ( '\n' ) ;
3429}
3530
31+ /**
32+ * Generates a user-readable string from a percentage change
33+ * @param {string[] } headers
34+ */
35+ function emojiPercent ( change ) {
36+ if ( change > 0 ) {
37+ return `:small_red_triangle:+${ change } %` ;
38+ } else if ( change <= 0 ) {
39+ return `${ change } %` ;
40+ }
41+ }
42+
3643// Grab the results.json before we ran CI via the GH API
37- fetch ( 'http://react.zpao.com/builds/master/latest/results.json' ) . then (
38- async response => {
39- const previousBuildResults = await response . json ( ) ;
40- const results = generateResultsArray (
41- currentBuildResults ,
42- previousBuildResults
43- ) ;
44-
45- markdown ( '### Bundle Changes:\n' ) ;
46- const percentToWarrentShowing = 1
47- const onlyResultsToShow = results . filter ( f => Math . abs ( f [ 3 ] ) > percentToWarrentShowing || Math . abs ( f [ 7 ] ) ) ;
48- const groupBy
49-
50- markdown ( generateMDTable ( resultsHeaders , results ) ) ;
44+ // const baseMerge = danger.github.pr.base.sha
45+ const parentOfOldestCommit = danger . git . commits [ 0 ] . parents [ 0 ] ;
46+ const commitURL = sha =>
47+ `http://react.zpao.com/builds/master/_commits/${ sha } /results.json` ;
48+
49+ fetch ( commitURL ( parentOfOldestCommit ) ) . then ( async response => {
50+ const previousBuildResults = await response . json ( ) ;
51+ const results = generateResultsArray (
52+ currentBuildResults ,
53+ previousBuildResults
54+ ) ;
55+
56+ const percentToWarrentShowing = 1 ;
57+ const packagesToShow = results
58+ . filter (
59+ r =>
60+ Math . abs ( r . prevFileSizeChange ) > percentToWarrentShowing ||
61+ Math . abs ( r . prevGzipSizeChange ) > percentToWarrentShowing
62+ )
63+ . map ( r => r . packageName ) ;
64+
65+ if ( packagesToShow . length ) {
66+ let allTables = [ ] ;
67+
68+ // Highlight React and React DOM changes inline
69+ // e.g. react: `react.production.min.js`: -3%, `react.development.js`: +4%
70+
71+ if ( packagesToShow . includes ( 'react' ) ) {
72+ const reactProd = results . find (
73+ r => r . bundleType === 'UMD_PROD' && r . packageName === 'react'
74+ ) ;
75+ if (
76+ reactProd . prevFileSizeChange !== 0 ||
77+ reactProd . prevGzipSizeChange !== 0
78+ ) {
79+ const changeSize = emojiPercent ( reactProd . prevFileSizeChange ) ;
80+ const changeGzip = emojiPercent ( reactProd . prevGzipSizeChange ) ;
81+ markdown ( `React: size: ${ changeSize } , gzip: ${ changeGzip } ` ) ;
82+ }
83+ }
84+
85+ if ( packagesToShow . includes ( 'react-dom' ) ) {
86+ const reactDOMProd = results . find (
87+ r => r . bundleType === 'UMD_PROD' && r . packageName === 'react-dom'
88+ ) ;
89+ if (
90+ reactDOMProd . prevFileSizeChange !== 0 ||
91+ reactDOMProd . prevGzipSizeChange !== 0
92+ ) {
93+ const changeSize = emojiPercent ( reactDOMProd . prevFileSizeChange ) ;
94+ const changeGzip = emojiPercent ( reactDOMProd . prevGzipSizeChange ) ;
95+ markdown ( `ReactDOM: size: ${ changeSize } , gzip: ${ changeGzip } ` ) ;
96+ }
97+ }
98+
99+ // Show a hidden summary table for all diffs
100+
101+ // eslint-disable-next-line no-var
102+ for ( var name of new Set ( packagesToShow ) ) {
103+ const thisBundleResults = results . filter ( r => r . packageName === name ) ;
104+ const changedFiles = thisBundleResults . filter (
105+ r => r . prevGzipSizeChange !== 0 || r . prevGzipSizeChange !== 0
106+ ) ;
107+
108+ const mdHeaders = [
109+ 'File' ,
110+ 'Filesize Diff' ,
111+ 'Gzip Diff' ,
112+ 'Prev Size' ,
113+ 'Current Size' ,
114+ 'Prev Gzip' ,
115+ 'Current Gzip' ,
116+ 'ENV' ,
117+ ] ;
118+
119+ const mdRows = changedFiles . map ( r => [
120+ r . filename ,
121+ emojiPercent ( r . prevFileSizeChange ) ,
122+ emojiPercent ( r . prevGzipSizeChange ) ,
123+ r . prevSize ,
124+ r . prevFileSize ,
125+ r . prevGzip ,
126+ r . prevGzipSize ,
127+ r . bundleType ,
128+ ] ) ;
129+
130+ allTables . push ( `\n## ${ name } ` ) ;
131+ allTables . push ( generateMDTable ( mdHeaders , mdRows ) ) ;
132+ }
133+
134+ const summary = `
135+ <details>
136+ <summary>Details of bundled changes.</summary>
137+
138+ <p>Comparing: ${ danger . github . pr . base . sha } ...${ danger . github . pr . head . sha } </p>
139+
140+
141+ ${ allTables . join ( '\n' ) }
142+
143+ </details>
144+ ` ;
145+ markdown ( summary ) ;
51146 }
52- ) ;
147+ } ) ;
0 commit comments