UNPKG

3.12 kBJavaScriptView Raw
1'use strict';
2
3const path = require('path-posix');
4const _ = require('lodash');
5const defaultGens = require('./default-gens');
6const validateOptions = require('./validate-options');
7
8function getAddonPublicDir(app) {
9 // When SVGJar is used by an addon, the addon's public directory
10 // is used as the default source of SVG images.
11 return path.join(app.root, app.treePaths.public);
12}
13
14function getAppPublicDir(app) {
15 // When SVGJar is used by an app, the apps's public directory
16 // is used as the default source of SVG images.
17 return app.options.trees.public;
18}
19
20function getPluginName(plugin) {
21 return Object.keys(plugin)[0];
22}
23
24function 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
46function 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
118module.exports = buildOptions;