UNPKG

5.02 kBJavaScriptView Raw
1'use strict';
2
3var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
4
5var path = require('path');
6var fs = require('fs');
7var _ = require('lodash');
8var CachingWriter = require('broccoli-caching-writer');
9var mkdirp = require('mkdirp');
10var validateAssets = require('./validate-assets');
11var svgDataFor = require('./utils/svg-data-for');
12
13var _require = require('./utils/general');
14
15var filePathsOnlyFor = _require.filePathsOnlyFor;
16var relativePathFor = _require.relativePathFor;
17var makeAssetId = _require.makeAssetId;
18
19
20function svgSizeFor(svgAttrs) {
21 var _split = (svgAttrs.viewBox || '').split(/\s+/);
22
23 var _split2 = _slicedToArray(_split, 4);
24
25 var vbWidth = _split2[2];
26 var vgHeight = _split2[3];
27
28
29 return {
30 width: parseFloat(svgAttrs.width || vbWidth) || null,
31 height: parseFloat(svgAttrs.height || vgHeight) || null
32 };
33}
34
35function stringSizeInKb(string) {
36 var bytes = Buffer.byteLength(string, 'utf8');
37 return parseFloat((bytes / 1024).toFixed(2));
38}
39
40/**
41 Required options:
42 idGen
43 idGenOpts
44 copypastaGen
45 stripPath
46 strategy
47 outputFile
48
49 Optional:
50 ui
51 annotation
52*/
53function ViewerAssetsBuilder(inputNode) {
54 var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
55
56 CachingWriter.call(this, [inputNode], {
57 name: 'ViewerAssetsBuilder',
58 annotation: options.annotation
59 });
60
61 this.ui = options.ui;
62 this.options = {
63 idGen: _.partial(options.idGen, _, options.idGenOpts),
64 copypastaGen: options.copypastaGen,
65 stripPath: options.stripPath,
66 strategy: options.strategy,
67 outputFile: options.outputFile
68 };
69}
70
71ViewerAssetsBuilder.prototype = Object.create(CachingWriter.prototype);
72ViewerAssetsBuilder.prototype.constructor = ViewerAssetsBuilder;
73
74ViewerAssetsBuilder.prototype.build = function () {
75 var _options = this.options;
76 var idGen = _options.idGen;
77 var stripPath = _options.stripPath;
78 var strategy = _options.strategy;
79
80 var inputPath = this.inputPaths[0];
81 var toRelative = _.partial(relativePathFor, _, inputPath);
82 var idFor = _.partial(makeAssetId, _, stripPath, idGen);
83 var assets = this.getAssets(filePathsOnlyFor(this.listFiles()), toRelative, idFor);
84
85 if (this.ui) {
86 validateAssets(assets, strategy, this.ui);
87 }
88
89 var viewerItems = this.viewerItemsFor(assets, inputPath, this.options);
90 var outputFilePath = path.join(this.outputPath, this.options.outputFile);
91 mkdirp.sync(path.dirname(outputFilePath));
92 fs.writeFileSync(outputFilePath, JSON.stringify(viewerItems));
93};
94
95ViewerAssetsBuilder.prototype.getAssets = function (filePaths, toRelative, idFor) {
96 return _(filePaths).filter(function (filePath) {
97 return filePath.indexOf('__original__') === -1;
98 }).map(function (filePath) {
99 return [filePath, fs.readFileSync(filePath, 'UTF-8')];
100 }).filter(function (_ref) {
101 var _ref2 = _slicedToArray(_ref, 2);
102
103 var svgContent = _ref2[1];
104 return !!svgContent;
105 }).map(function (_ref3) {
106 var _ref4 = _slicedToArray(_ref3, 2);
107
108 var filePath = _ref4[0];
109 var svgContent = _ref4[1];
110
111 var relativePath = toRelative(filePath);
112
113 return {
114 id: idFor(relativePath),
115 svgData: svgDataFor(svgContent),
116 optimizedSvg: svgContent,
117 relativePath: relativePath
118 };
119 }).value();
120};
121
122ViewerAssetsBuilder.prototype.viewerItemsFor = function (assets, inputPath, options) {
123 var strategy = options.strategy;
124 var copypastaGen = options.copypastaGen;
125
126 var originalPath = path.join(inputPath, '__original__');
127
128 return assets.map(function (asset) {
129 var _svgSizeFor = svgSizeFor(asset.svgData.attrs);
130
131 var width = _svgSizeFor.width;
132 var height = _svgSizeFor.height;
133
134 var originalFilePath = path.join(originalPath, asset.relativePath);
135 var originalSvg = fs.readFileSync(originalFilePath, 'UTF-8');
136
137 return {
138 svg: asset.svgData,
139 originalSvg: originalSvg,
140 width: width,
141 height: height,
142 fileName: path.basename(asset.relativePath),
143 fileDir: path.dirname(asset.relativePath).replace('.', '/'),
144 fileSize: stringSizeInKb(originalSvg) + ' KB',
145 optimizedFileSize: stringSizeInKb(asset.optimizedSvg) + ' KB',
146 baseSize: _.isNull(height) ? 'unknown' : height + 'px',
147 fullBaseSize: width + 'x' + height + 'px',
148 copypasta: copypastaGen(asset.id),
149 strategy: strategy
150 };
151 });
152};
153
154module.exports = ViewerAssetsBuilder;
\No newline at end of file