svg-to-icon-component-runtime-generator.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435
  1. const path = require('path');
  2. const pascalCase = require('pascal-case');
  3. const { stringifyRequest } = require('loader-utils');
  4. const { stringifySymbol, stringify } = require('../../lib/utils');
  5. module.exports = function runtimeGenerator({ symbol, config, context, loaderContext }) {
  6. const { spriteModule, symbolModule, runtimeOptions } = config;
  7. const compilerContext = loaderContext._compiler.context;
  8. const iconModulePath = path.resolve(compilerContext, runtimeOptions.iconModule);
  9. const iconModuleRequest = stringify(
  10. path.relative(path.dirname(symbol.request.file), iconModulePath)
  11. );
  12. const spriteRequest = stringifyRequest({ context }, spriteModule);
  13. const symbolRequest = stringifyRequest({ context }, symbolModule);
  14. const parentComponentDisplayName = 'SpriteSymbolComponent';
  15. const displayName = `${pascalCase(symbol.id)}${parentComponentDisplayName}`;
  16. return `
  17. import React from 'react';
  18. import SpriteSymbol from ${symbolRequest};
  19. import sprite from ${spriteRequest};
  20. import ${parentComponentDisplayName} from ${iconModuleRequest};
  21. const symbol = new SpriteSymbol(${stringifySymbol(symbol)});
  22. sprite.add(symbol);
  23. export default class ${displayName} extends React.Component {
  24. render() {
  25. return <${parentComponentDisplayName} glyph="${symbol.id}" {...this.props} />;
  26. }
  27. }
  28. `;
  29. };