UNPKG

2.58 kBJavaScriptView Raw
1const path = require('path');
2const fs = require('fs');
3const _ = require('lodash');
4const CachingWriter = require('broccoli-caching-writer');
5const mkdirp = require('mkdirp');
6
7const svgJarRepoUrl = 'https://github.com/ivanvotti/ember-svg-jar';
8
9function filtersFor(assets, filters) {
10 return filters.map((filter) => (
11 {
12 name: filter.name,
13 key: filter.key,
14 items: _(assets)
15 .map(filter.key)
16 .without(undefined)
17 .countBy()
18 .toPairs()
19 .map(([name, count]) => ({ name, count }))
20 .sortBy('name')
21 .value()
22 }
23 ));
24}
25
26function ViewerBuilder(inputNode, options = {}) {
27 if (!options.outputFile) {
28 throw new Error('the outputFile option is required');
29 }
30
31 CachingWriter.call(this, [inputNode], {
32 name: 'ViewerBuilder',
33 annotation: options.annotation,
34 });
35
36 this.options = options;
37}
38
39ViewerBuilder.prototype = Object.create(CachingWriter.prototype);
40ViewerBuilder.prototype.constructor = ViewerBuilder;
41
42ViewerBuilder.prototype.build = function() {
43 let viewerContent = JSON.stringify(this.getViewerModel());
44 let outputFilePath = path.join(this.outputPath, this.options.outputFile);
45 mkdirp.sync(path.dirname(outputFilePath));
46 fs.writeFileSync(outputFilePath, viewerContent);
47};
48
49ViewerBuilder.prototype.getViewerModel = function() {
50 let assets = this.listFiles().reduce((items, filePath) => (
51 items.concat(JSON.parse(fs.readFileSync(filePath, 'UTF-8')))
52 ), []);
53
54 let details = [
55 { name: 'File name', key: 'fileName' },
56 { name: 'Directory', key: 'fileDir' },
57 { name: 'Base size', key: 'fullBaseSize' },
58 { name: 'Original file size', key: 'fileSize' },
59 { name: 'Optimized file size', key: 'optimizedFileSize' },
60 { name: 'Strategy', key: 'strategy' }
61 ];
62
63 let searchKeys = ['fileName', 'fileDir'];
64
65 let sortBy = [
66 { name: 'File name', key: 'fileName' },
67 { name: 'Base size', key: 'height' }
68 ];
69
70 let arrangeBy = [
71 { name: 'Directory', key: 'fileDir' },
72 { name: 'Base size', key: 'baseSize' }
73 ];
74
75 let filterBy = [
76 { name: 'Directory', key: 'fileDir' },
77 { name: 'Base size', key: 'baseSize' }
78 ];
79
80 if (this.options.hasManyStrategies) {
81 filterBy.push({ name: 'Strategy', key: 'strategy' });
82 }
83
84 let links = [
85 { text: 'Contribute', url: svgJarRepoUrl },
86 { text: 'About', url: `${svgJarRepoUrl}/blob/master/README.md` }
87 ];
88
89 return {
90 assets,
91 details,
92 searchKeys,
93 sortBy,
94 arrangeBy,
95 filters: filtersFor(assets, filterBy),
96 links
97 };
98};
99
100module.exports = ViewerBuilder;