packages/extract-svg-sprite-webpack-plugin/lib/utils/runtime-generator.js (76 lines of code) (raw):

const mixer = require('svg-mixer'); const generator = require('./replacement-generator'); const stringify = JSON.stringify; class RuntimeGenerator { /** * @param {mixer.SpriteSymbol} symbol * @param {ExtractSvgSpritePluginConfig} config */ constructor(symbol, config) { this.symbol = symbol; this.config = config; this.isClassicSprite = config.spriteType === mixer.Sprite.TYPE; } /** * @return {string} */ publicPath() { return this.config.publicPath ? stringify(this.config.publicPath) : '__webpack_public_path__'; } /** * @return {string} */ id() { return stringify(this.symbol.id); } /** * Returns executable expression, not just a string, e.g: * __webpack_require__.p + "sprite.svg" * * Or with custom publicPath config option: * "/public-path/" + "sprite.svg" * * @return {string} */ url() { const { symbol, config } = this; const symbolUrl = generator.symbolUrl(symbol, config).token; return config.filename && config.emit ? `${this.publicPath()} + ${stringify(symbolUrl)}` : `${stringify(symbolUrl)}`; } /** * @return {number} */ width() { return this.symbol.width; } /** * @return {number} */ height() { return this.symbol.height; } /** * @return {string} */ viewBox() { return stringify(this.symbol.viewBox.join(' ')); } /** * Will be null for stack sprite * @return {string|null} */ backgroundPosition() { if (this.isClassicSprite) { return stringify([ generator.bgPosLeft(this.symbol.request).token, generator.bgPosTop(this.symbol.request).token ].join(' ')); } return null; } /** * Will be null for stack sprite * @return {string|null} */ backgroundSize() { if (this.isClassicSprite) { return stringify([ generator.bgSizeWidth(this.symbol.request).token, generator.bgSizeHeight(this.symbol.request).token ].join(' ')); } return null; } /** * @return {string} */ toString() { return `function () { return ${this.url()} }`; } /** * @param {Object<string, string>} fields * @return {string} */ generateWrapper(fields) { const body = Object.keys(fields) .filter(field => !!fields[field]) .map(field => `${field}: ${fields[field]}`) .join(',\n '); return `{\n ${body}\n}`; } /** * @return {string} */ generate() { const runtime = this.generateWrapper({ id: this.id(), url: this.url(), width: this.width(), height: this.height(), viewBox: this.viewBox(), toString: this.toString(), backgroundSize: this.backgroundSize(), backgroundPosition: this.backgroundPosition() }); return `module.exports = ${runtime}`; } } module.exports = RuntimeGenerator;