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
16+ markdown ( 'Working with commit: #' + danger . github . pr . base . sha ) ;
17+
2118/**
2219 * Generates a Markdown table
2320 * @param {string[] } headers
@@ -33,20 +30,117 @@ function generateMDTable(headers, body) {
3330 return tableHeaders . join ( '\n' ) + '\n' + tablebody . join ( '\n' ) ;
3431}
3532
33+ /**
34+ * Generates a user-readable string from a percentage change
35+ * @param {string[] } headers
36+ */
37+ function emojiPercent ( change ) {
38+ if ( change > 0 ) {
39+ return `:small_red_triangle:+${ change } %` ;
40+ } else if ( change <= 0 ) {
41+ return `${ change } %` ;
42+ }
43+ }
44+
3645// 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 ) ) ;
46+ // const baseMerge = danger.github.pr.base.sha
47+ const parentOfOldestCommit = danger . git . commits [ 0 ] . parents [ 0 ] ;
48+ const commitURL = sha =>
49+ `http://react.zpao.com/builds/master/_commits/${ sha } /results.json` ;
50+
51+ fetch ( commitURL ( parentOfOldestCommit ) ) . then ( async response => {
52+ const previousBuildResults = await response . json ( ) ;
53+ const results = generateResultsArray (
54+ currentBuildResults ,
55+ previousBuildResults
56+ ) ;
57+
58+ const percentToWarrentShowing = 1 ;
59+ const packagesToShow = results
60+ . filter (
61+ r =>
62+ Math . abs ( r . prevFileSizeChange ) > percentToWarrentShowing ||
63+ Math . abs ( r . prevGzipSizeChange ) > percentToWarrentShowing
64+ )
65+ . map ( r => r . packageName ) ;
66+
67+ if ( packagesToShow . length ) {
68+ let allTables = [ ] ;
69+
70+ // Highlight React and React DOM changes inline
71+ // e.g. react: `react.production.min.js`: -3%, `react.development.js`: +4%
72+
73+ if ( packagesToShow . includes ( 'react' ) ) {
74+ const reactProd = results . find (
75+ r => r . bundleType === 'UMD_PROD' && r . packageName === 'react'
76+ ) ;
77+ if (
78+ reactProd . prevFileSizeChange !== 0 ||
79+ reactProd . prevGzipSizeChange !== 0
80+ ) {
81+ const changeSize = emojiPercent ( reactProd . prevFileSizeChange ) ;
82+ const changeGzip = emojiPercent ( reactProd . prevGzipSizeChange ) ;
83+ markdown ( `React: size: ${ changeSize } , gzip: ${ changeGzip } ` ) ;
84+ }
85+ }
86+
87+ if ( packagesToShow . includes ( 'react-dom' ) ) {
88+ const reactDOMProd = results . find (
89+ r => r . bundleType === 'UMD_PROD' && r . packageName === 'react-dom'
90+ ) ;
91+ if (
92+ reactDOMProd . prevFileSizeChange !== 0 ||
93+ reactDOMProd . prevGzipSizeChange !== 0
94+ ) {
95+ const changeSize = emojiPercent ( reactDOMProd . prevFileSizeChange ) ;
96+ const changeGzip = emojiPercent ( reactDOMProd . prevGzipSizeChange ) ;
97+ markdown ( `ReactDOM: size: ${ changeSize } , gzip: ${ changeGzip } ` ) ;
98+ }
99+ }
100+
101+ // Show a hidden summary table for all diffs
102+
103+ // eslint-disable-next-line no-var
104+ for ( var name of new Set ( packagesToShow ) ) {
105+ const thisBundleResults = results . filter ( r => r . packageName === name ) ;
106+ const changedFiles = thisBundleResults . filter (
107+ r => r . prevGzipSizeChange !== 0 || r . prevGzipSizeChange !== 0
108+ ) ;
109+
110+ const mdHeaders = [
111+ 'File' ,
112+ 'Filesize Diff' ,
113+ 'Gzip Diff' ,
114+ 'Prev Size' ,
115+ 'Current Size' ,
116+ 'Prev Gzip' ,
117+ 'Current Gzip' ,
118+ 'ENV' ,
119+ ] ;
120+
121+ const mdRows = changedFiles . map ( r => [
122+ r . filename ,
123+ emojiPercent ( r . prevFileSizeChange ) ,
124+ emojiPercent ( r . prevGzipSizeChange ) ,
125+ r . prevSize ,
126+ r . prevFileSize ,
127+ r . prevGzip ,
128+ r . prevGzipSize ,
129+ r . bundleType ,
130+ ] ) ;
131+
132+ allTables . push ( `\n## ${ name } ` ) ;
133+ allTables . push ( generateMDTable ( mdHeaders , mdRows ) ) ;
134+ }
135+
136+ const summary = `
137+ <details>
138+ <summary>Details of bundled changes.</summary>
139+
140+ ${ allTables . join ( '\n' ) }
141+
142+ </details>
143+ ` ;
144+ markdown ( summary ) ;
51145 }
52- ) ;
146+ } ) ;
0 commit comments