| import merge from 'deepmerge'; | 
| import wrapInSvgString from './utils/wrap-in-svg-string'; | 
| import defaultConfig from './sprite.config'; | 
|   | 
| export default class Sprite { | 
|   /** | 
|    * @param {Object} [config] | 
|    */ | 
|   constructor(config) { | 
|     this.config = merge(defaultConfig, config || {}); | 
|     this.symbols = []; | 
|   } | 
|   | 
|   /** | 
|    * Add new symbol. If symbol with the same id exists it will be replaced. | 
|    * @param {SpriteSymbol} symbol | 
|    * @return {boolean} `true` - symbol was added, `false` - replaced | 
|    */ | 
|   add(symbol) { | 
|     const { symbols } = this; | 
|     const existing = this.find(symbol.id); | 
|   | 
|     if (existing) { | 
|       symbols[symbols.indexOf(existing)] = symbol; | 
|       return false; | 
|     } | 
|   | 
|     symbols.push(symbol); | 
|     return true; | 
|   } | 
|   | 
|   /** | 
|    * Remove symbol & destroy it | 
|    * @param {string} id | 
|    * @return {boolean} `true` - symbol was found & successfully destroyed, `false` - otherwise | 
|    */ | 
|   remove(id) { | 
|     const { symbols } = this; | 
|     const symbol = this.find(id); | 
|   | 
|     if (symbol) { | 
|       symbols.splice(symbols.indexOf(symbol), 1); | 
|       symbol.destroy(); | 
|       return true; | 
|     } | 
|   | 
|     return false; | 
|   } | 
|   | 
|   /** | 
|    * @param {string} id | 
|    * @return {SpriteSymbol|null} | 
|    */ | 
|   find(id) { | 
|     return this.symbols.filter(s => s.id === id)[0] || null; | 
|   } | 
|   | 
|   /** | 
|    * @param {string} id | 
|    * @return {boolean} | 
|    */ | 
|   has(id) { | 
|     return this.find(id) !== null; | 
|   } | 
|   | 
|   /** | 
|    * @return {string} | 
|    */ | 
|   stringify() { | 
|     const { attrs } = this.config; | 
|     const stringifiedSymbols = this.symbols.map(s => s.stringify()).join(''); | 
|     return wrapInSvgString(stringifiedSymbols, attrs); | 
|   } | 
|   | 
|   /** | 
|    * @return {string} | 
|    */ | 
|   toString() { | 
|     return this.stringify(); | 
|   } | 
|   | 
|   destroy() { | 
|     this.symbols.forEach(s => s.destroy()); | 
|   } | 
| } |