1 | 'use strict';
|
2 |
|
3 | const path = require('path-posix');
|
4 | const _ = require('lodash');
|
5 | const defaultGens = require('./default-gens');
|
6 | const validateOptions = require('./validate-options');
|
7 |
|
8 | function getAddonPublicDir(app) {
|
9 |
|
10 |
|
11 | return path.join(app.root, app.treePaths.public);
|
12 | }
|
13 |
|
14 | function getAppPublicDir(app) {
|
15 |
|
16 |
|
17 | return app.options.trees.public;
|
18 | }
|
19 |
|
20 | function getPluginName(plugin) {
|
21 | return Object.keys(plugin)[0];
|
22 | }
|
23 |
|
24 | function mergeOptimizerPlugins(defaultPlugins, customPlugins) {
|
25 | let modifiedPlugins = defaultPlugins.map((defaultPlugin) => {
|
26 | let pluginName = getPluginName(defaultPlugin);
|
27 | let customPlugin = customPlugins.find((plugin) => (
|
28 | plugin[pluginName] !== undefined
|
29 | ));
|
30 |
|
31 | return Object.assign({}, customPlugin || defaultPlugin);
|
32 | });
|
33 |
|
34 | let newPlugins = customPlugins.filter((customPlugin) => {
|
35 | let pluginName = getPluginName(customPlugin);
|
36 | let isNewPlugin = defaultPlugins.every((defaultPlugin) => (
|
37 | defaultPlugin[pluginName] === undefined
|
38 | ));
|
39 |
|
40 | return isNewPlugin;
|
41 | });
|
42 |
|
43 | return [...modifiedPlugins, ...newPlugins];
|
44 | }
|
45 |
|
46 | function buildOptions(app) {
|
47 | let customOpts = app.options.svgJar || {};
|
48 | let isDevelopment = app.env === 'development';
|
49 | let isUsedByAddon = !!app.parent;
|
50 |
|
51 | let defaultSourceDir = isUsedByAddon
|
52 | ? getAddonPublicDir(app)
|
53 | : getAppPublicDir(app);
|
54 |
|
55 | let defaultOpts = {
|
56 | rootURL: '/',
|
57 | sourceDirs: [defaultSourceDir],
|
58 | strategy: 'inline',
|
59 | stripPath: true,
|
60 | optimizer: {
|
61 | plugins: [
|
62 | { removeTitle: false },
|
63 | { removeDesc: { removeAny: false } },
|
64 | { removeViewBox: false }
|
65 | ]
|
66 | },
|
67 | persist: true,
|
68 |
|
69 | validations: {
|
70 | validateViewBox: true,
|
71 | checkForDuplicates: true
|
72 | },
|
73 |
|
74 | viewer: {
|
75 | enabled: isDevelopment && !isUsedByAddon
|
76 | },
|
77 |
|
78 | inline: {
|
79 | idGen: defaultGens.inlineIdGen,
|
80 | copypastaGen: defaultGens.inlineCopypastaGen
|
81 | },
|
82 |
|
83 | symbol: {
|
84 | idGen: defaultGens.symbolIdGen,
|
85 | copypastaGen: defaultGens.symbolCopypastaGen,
|
86 | outputFile: '/assets/symbols.svg',
|
87 | prefix: '',
|
88 | includeLoader: true,
|
89 | containerAttrs: {
|
90 | style: 'position: absolute; width: 0; height: 0;',
|
91 | width: '0',
|
92 | height: '0',
|
93 | version: '1.1',
|
94 | xmlns: 'http://www.w3.org/2000/svg',
|
95 | 'xmlns:xlink': 'http://www.w3.org/1999/xlink'
|
96 | }
|
97 | }
|
98 | };
|
99 |
|
100 | validateOptions(defaultOpts, customOpts);
|
101 |
|
102 | let options = _.merge({}, defaultOpts, customOpts);
|
103 | options.strategy = _.castArray(options.strategy);
|
104 |
|
105 | if (customOpts.optimizer && customOpts.optimizer.plugins) {
|
106 | options.optimizer.plugins = mergeOptimizerPlugins(
|
107 | defaultOpts.optimizer.plugins, customOpts.optimizer.plugins
|
108 | );
|
109 | }
|
110 |
|
111 | if (customOpts.symbol && customOpts.symbol.containerAttrs) {
|
112 | options.symbol.containerAttrs = customOpts.symbol.containerAttrs;
|
113 | }
|
114 |
|
115 | return options;
|
116 | }
|
117 |
|
118 | module.exports = buildOptions;
|