|
| 1 | +const packages = [ |
| 2 | + '@ember/-internals', |
| 3 | + '@ember/application', |
| 4 | + '@ember/array', |
| 5 | + '@ember/canary-features', |
| 6 | + '@ember/component', |
| 7 | + '@ember/controller', |
| 8 | + '@ember/debug', |
| 9 | + '@ember/deprecated-features', |
| 10 | + '@ember/destroyable', |
| 11 | + '@ember/enumerable', |
| 12 | + '@ember/helper', |
| 13 | + '@ember/instrumentation', |
| 14 | + '@ember/modifier', |
| 15 | + '@ember/object', |
| 16 | + '@ember/owner', |
| 17 | + '@ember/renderer', |
| 18 | + '@ember/routing', |
| 19 | + '@ember/runloop', |
| 20 | + '@ember/service', |
| 21 | + '@ember/template', |
| 22 | + '@ember/template-compilation', |
| 23 | + '@ember/template-compiler', |
| 24 | + '@ember/template-factory', |
| 25 | + '@ember/test', |
| 26 | + '@ember/utils', |
| 27 | + '@ember/version', |
| 28 | + '@glimmer/destroyable', |
| 29 | + '@glimmer/encoder', |
| 30 | + '@glimmer/env', |
| 31 | + '@glimmer/global-context', |
| 32 | + '@glimmer/manager', |
| 33 | + '@glimmer/node', |
| 34 | + '@glimmer/opcode-compiler', |
| 35 | + '@glimmer/owner', |
| 36 | + '@glimmer/program', |
| 37 | + '@glimmer/reference', |
| 38 | + '@glimmer/runtime', |
| 39 | + '@glimmer/tracking', |
| 40 | + '@glimmer/util', |
| 41 | + '@glimmer/validator', |
| 42 | + '@glimmer/vm', |
| 43 | + '@glimmer/wire-format', |
| 44 | +]; |
| 45 | +import glob from 'glob'; |
| 46 | +import nodeGzip from 'node-gzip'; |
| 47 | + |
| 48 | +import { join } from 'node:path'; |
| 49 | +import { readFileSync, writeFileSync } from 'node:fs'; |
| 50 | +import { minify } from 'terser'; |
| 51 | +import { transformSync } from '@babel/core'; |
| 52 | +import * as brotli from 'brotli'; |
| 53 | +import { partial } from 'filesize'; |
| 54 | +const size = partial({ standard: 'jedec' }); |
| 55 | + |
| 56 | +const root = join(process.cwd(), 'dist/packages'); |
| 57 | + |
| 58 | +let min = {}; |
| 59 | +let br = {}; |
| 60 | +let gzip = {}; |
| 61 | + |
| 62 | +let packageData = { |
| 63 | + ember: [ |
| 64 | + /* pkg, min, gz, br */ |
| 65 | + ], |
| 66 | + glimmer: [], |
| 67 | +}; |
| 68 | + |
| 69 | +function totalMin(dataset) { |
| 70 | + return dataset.reduce((a, b) => a + b[1], 0); |
| 71 | +} |
| 72 | + |
| 73 | +function totalGz(dataset) { |
| 74 | + return dataset.reduce((a, b) => a + b[2], 0); |
| 75 | +} |
| 76 | + |
| 77 | +// function totalBr(dataset) { |
| 78 | +// return dataset.reduce((a, b) => a + b[3], 0); |
| 79 | +// } |
| 80 | + |
| 81 | +import { buildMacros } from '@embroider/macros/babel'; |
| 82 | + |
| 83 | +process.env.NODE_ENV = 'production'; |
| 84 | +process.env.EMBER_ENV = 'production'; |
| 85 | + |
| 86 | +const macros = buildMacros(); |
| 87 | +let babelOptions = { |
| 88 | + cwd: process.cwd(), |
| 89 | + plugins: [...macros.babelMacros], |
| 90 | +}; |
| 91 | + |
| 92 | +for (const pkg of packages) { |
| 93 | + let jsFiles = glob.sync(`${root}/${pkg}/**/*.js`); |
| 94 | + |
| 95 | + for (let file of jsFiles) { |
| 96 | + let source = readFileSync(file, 'utf8'); |
| 97 | + let transformed = transformSync(source, { |
| 98 | + ...babelOptions, |
| 99 | + filename: file, |
| 100 | + }).code; |
| 101 | + let result = await minify(transformed, { |
| 102 | + module: true, |
| 103 | + mangle: false, |
| 104 | + ecma: 2021, |
| 105 | + compress: { |
| 106 | + ecma: 2021, |
| 107 | + passes: 3, |
| 108 | + defaults: true, |
| 109 | + keep_fargs: false, |
| 110 | + keep_fnames: false, |
| 111 | + /** |
| 112 | + * Required for {{debugger}} to work |
| 113 | + */ |
| 114 | + drop_debugger: false, |
| 115 | + }, |
| 116 | + }); |
| 117 | + |
| 118 | + let minFileName = file + '.min'; |
| 119 | + writeFileSync(minFileName, result.code); |
| 120 | + |
| 121 | + let compressed = brotli.compress(result.code, { |
| 122 | + // mode: 1, // 0 = generic, 1 = text, 2 = font (WOFF2) |
| 123 | + quality: 11, // 0 - 11 |
| 124 | + // lgwin: 22, // window size |
| 125 | + }); |
| 126 | + |
| 127 | + // console.log(brotli.decompress(brotli.compress(result.code)).length, result.code.length); |
| 128 | + |
| 129 | + let compressedFileName = minFileName + '.br'; |
| 130 | + writeFileSync(compressedFileName, compressed); |
| 131 | + |
| 132 | + let gzipFileName = minFileName + '.gz'; |
| 133 | + let gzipCompressed = (await nodeGzip.gzip(result.code)).toString(); |
| 134 | + writeFileSync(gzipFileName, gzipCompressed); |
| 135 | + |
| 136 | + let minSize = new Blob([result.code]).size; |
| 137 | + let brSize = new Blob([compressed.toString()]).size; |
| 138 | + let gzSize = new Blob([gzipCompressed]).size; |
| 139 | + |
| 140 | + min[pkg] = min[pkg] || 0; |
| 141 | + min[pkg] += minSize; |
| 142 | + |
| 143 | + br[pkg] = br[pkg] || 0; |
| 144 | + br[pkg] += brSize; |
| 145 | + |
| 146 | + gzip[pkg] = gzip[pkg] || 0; |
| 147 | + gzip[pkg] += gzSize; |
| 148 | + } |
| 149 | +} |
| 150 | + |
| 151 | +import { table } from 'table'; |
| 152 | + |
| 153 | +function printTable(data) { |
| 154 | + // eslint-disable-next-line no-console |
| 155 | + console.info( |
| 156 | + table(data, { |
| 157 | + drawHorizontalLine: (lineIndex, rowCount) => { |
| 158 | + return lineIndex === 0 || lineIndex === 1 || lineIndex === 2 || lineIndex === rowCount; |
| 159 | + }, |
| 160 | + }) |
| 161 | + ); |
| 162 | +} |
| 163 | + |
| 164 | +printTable([ |
| 165 | + ['', 'Min', 'Gzip' /* 'Brotli' */], |
| 166 | + [ |
| 167 | + 'Total', |
| 168 | + size(Object.values(min).reduce((a, b) => a + b, 0)), |
| 169 | + size(Object.values(gzip).reduce((a, b) => a + b, 0)), |
| 170 | + // size(Object.values(br).reduce((a, b) => a + b, 0)), |
| 171 | + ], |
| 172 | +]); |
| 173 | + |
| 174 | +for (const pkg of packages.filter((p) => p.startsWith('@ember'))) { |
| 175 | + let minSize = min[pkg]; |
| 176 | + let brSize = br[pkg]; |
| 177 | + let gzSize = gzip[pkg]; |
| 178 | + |
| 179 | + packageData.ember.push([pkg, minSize, gzSize, brSize]); |
| 180 | +} |
| 181 | +for (const pkg of packages.filter((p) => p.startsWith('@glimmer'))) { |
| 182 | + let minSize = min[pkg]; |
| 183 | + let brSize = br[pkg]; |
| 184 | + let gzSize = gzip[pkg]; |
| 185 | + |
| 186 | + packageData.glimmer.push([pkg, minSize, gzSize, brSize]); |
| 187 | +} |
| 188 | + |
| 189 | +printTable([ |
| 190 | + ['@ember/*', 'Min', 'Gzip' /* 'Brotli' */], |
| 191 | + [ |
| 192 | + 'Total', |
| 193 | + size(totalMin(packageData.ember)), |
| 194 | + size(totalGz(packageData.ember)), |
| 195 | + // size(totalBr(packageData.ember)), |
| 196 | + ], |
| 197 | + ...packageData.ember.map((x) => [ |
| 198 | + x[0].replace('@ember/', ''), |
| 199 | + size(x[1]), |
| 200 | + size(x[2]), |
| 201 | + // size(x[3]), |
| 202 | + ]), |
| 203 | +]); |
| 204 | + |
| 205 | +printTable([ |
| 206 | + ['@glimmer/*', 'Min', 'Gzip' /* 'Brotli' */], |
| 207 | + [ |
| 208 | + 'Total', |
| 209 | + size(totalMin(packageData.glimmer)), |
| 210 | + size(totalGz(packageData.glimmer)), |
| 211 | + // size(totalBr(packageData.glimmer)), |
| 212 | + ], |
| 213 | + ...packageData.glimmer.map((x) => [ |
| 214 | + x[0].replace('@glimmer/', ''), |
| 215 | + size(x[1]), |
| 216 | + size(x[2]), |
| 217 | + // size(x[3]), |
| 218 | + ]), |
| 219 | +]); |
0 commit comments