const { isAbsolute, join } = require('path'); const { stringifyRequest } = require('loader-utils'); const { stringify, stringifySymbol, generateImport, generateExport, generateSpritePlaceholder } = require('./utils'); /** * @param {Object} params * @param {SpriteSymbol} params.symbol - Sprite symbol instance {@see https://git.io/v9k8g} * @param {SVGSpriteLoaderConfig} params.config - Parsed loader config * @param {string} params.context - Context folder of current processing module * @param {Object} params.loaderContext {@see https://webpack.js.org/api/loaders/#the-loader-context} * @return {string} */ function runtimeGenerator(params) { const { symbol, config, context, loaderContext } = params; const { extract, esModule, spriteModule, symbolModule, runtimeCompat, publicPath } = config; let runtime; if (extract) { const spritePlaceholder = generateSpritePlaceholder(symbol.request.file); const path = stringify(publicPath) || '__webpack_public_path__'; const data = `{ id: ${stringify(symbol.useId)}, viewBox: ${stringify(symbol.viewBox)}, url: ${path} + ${stringify(spritePlaceholder)}, toString: function () { return this.url; } }`; runtime = generateExport(data, esModule); } else { const spriteModuleAbsPath = isAbsolute(spriteModule) ? spriteModule : join(context, spriteModule); const symbolModuleAbsPath = isAbsolute(symbolModule) ? symbolModule : join(context, symbolModule); const spriteModuleImport = stringifyRequest(loaderContext, spriteModuleAbsPath); const symbolModuleImport = stringifyRequest(loaderContext, symbolModuleAbsPath); runtime = [ generateImport('SpriteSymbol', symbolModuleImport, esModule), generateImport('sprite', spriteModuleImport, esModule), `var symbol = new SpriteSymbol(${stringifySymbol(symbol)})`, 'var result = sprite.add(symbol)', generateExport(runtimeCompat ? '"#" + symbol.id' : 'symbol', esModule) ].join(';\n'); } return runtime; } module.exports = runtimeGenerator;