mirror of
				https://github.com/elyby/accounts-frontend.git
				synced 2025-05-31 14:11:58 +05:30 
			
		
		
		
	
		
			
				
	
	
		
			218 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			218 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var path = require("path");
 | 
						|
 | 
						|
var glob = require('glob');
 | 
						|
var loaderUtils = require("loader-utils");
 | 
						|
var fontgen = require("webfonts-generator");
 | 
						|
 | 
						|
module.exports = function createImporter(options) {
 | 
						|
    return function(url, fileContext, done) {
 | 
						|
        if (options.test.test(url)) {
 | 
						|
            var context = this.options.includePaths;
 | 
						|
            var request = loaderUtils.urlToRequest(url);
 | 
						|
 | 
						|
            compiler.resolvers.normal.resolve(context, request, function(err, resourcePath) {
 | 
						|
                if (err) return done(new Error(err));
 | 
						|
 | 
						|
                var context = path.dirname(resourcePath);
 | 
						|
                var config = require(resourcePath);
 | 
						|
 | 
						|
                generate(
 | 
						|
                    config,
 | 
						|
                    options,
 | 
						|
                    resourcePath,
 | 
						|
                    context,
 | 
						|
                    function(err, content) {
 | 
						|
                        if (err) return done(new Error(err));
 | 
						|
 | 
						|
                        done({
 | 
						|
                            contents: content
 | 
						|
                        });
 | 
						|
                    }
 | 
						|
                );
 | 
						|
            });
 | 
						|
        } else {
 | 
						|
            done(false);
 | 
						|
        }
 | 
						|
    };
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
var Plugin = module.exports.Plugin = function() {};
 | 
						|
 | 
						|
Plugin.prototype.apply = function(compiler) {
 | 
						|
    setCompiler(compiler); // inject compiler to use in importer
 | 
						|
 | 
						|
    compiler.plugin("emit", function(compilation, callback) {
 | 
						|
        Object.keys(emitQueue).forEach(function(url) {
 | 
						|
            compilation.assets[url] = emitQueue[url];
 | 
						|
        });
 | 
						|
 | 
						|
        callback();
 | 
						|
    });
 | 
						|
};
 | 
						|
 | 
						|
var compiler;
 | 
						|
 | 
						|
function setCompiler(instance) {
 | 
						|
    // inject compiler instance for importer function
 | 
						|
    compiler = instance;
 | 
						|
}
 | 
						|
 | 
						|
var emitQueue = {};
 | 
						|
var RawSource = require('webpack-sources').RawSource;
 | 
						|
function emitFile(url, content) {
 | 
						|
    // TODO: support multiple plugin instances?
 | 
						|
    emitQueue[url] = new RawSource(content);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Partially modified code of fontgen goes next
 | 
						|
 */
 | 
						|
var mimeTypes = {
 | 
						|
    'eot': 'application/vnd.ms-fontobject',
 | 
						|
    'svg': 'image/svg+xml',
 | 
						|
    'ttf': 'application/x-font-ttf',
 | 
						|
    'woff': 'application/font-woff'
 | 
						|
};
 | 
						|
 | 
						|
function absolute(from, to) {
 | 
						|
    if (arguments.length < 2) {
 | 
						|
        return function (to) {
 | 
						|
            return path.resolve(from, to);
 | 
						|
        };
 | 
						|
    }
 | 
						|
    return path.resolve(from, to);
 | 
						|
}
 | 
						|
 | 
						|
function getFilesAndDeps(patterns, context) {
 | 
						|
    var files = [];
 | 
						|
    var filesDeps = [];
 | 
						|
    var directoryDeps = [];
 | 
						|
 | 
						|
 | 
						|
    function addFile(file) {
 | 
						|
        filesDeps.push(file);
 | 
						|
        files.push(absolute(context, file));
 | 
						|
    }
 | 
						|
 | 
						|
    function addByGlob(globExp) {
 | 
						|
        var globOptions = {cwd: context};
 | 
						|
 | 
						|
        var foundFiles = glob.sync(globExp, globOptions);
 | 
						|
        files = files.concat(foundFiles.map(absolute(context)));
 | 
						|
 | 
						|
        var globDirs = glob.sync(path.dirname(globExp) + '/', globOptions);
 | 
						|
        directoryDeps = directoryDeps.concat(globDirs.map(absolute(context)));
 | 
						|
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    // Re-work the files array.
 | 
						|
    patterns.forEach(function (pattern) {
 | 
						|
        if (glob.hasMagic(pattern)) {
 | 
						|
            addByGlob(pattern);
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            addFile(pattern);
 | 
						|
        }
 | 
						|
    });
 | 
						|
 | 
						|
    return {
 | 
						|
        files: files,
 | 
						|
        dependencies: {
 | 
						|
            directories: directoryDeps,
 | 
						|
            files: filesDeps
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
function generate(config, params, resourcePath, context, cb) {
 | 
						|
    config.__dirname = path.dirname(resourcePath);
 | 
						|
 | 
						|
    var filesAndDeps = getFilesAndDeps(config.files, context);
 | 
						|
    config.files = filesAndDeps.files;
 | 
						|
 | 
						|
    // With everything set up, let's make an ACTUAL config.
 | 
						|
    var formats = params.types || ['eot', 'woff', 'ttf', 'svg'];
 | 
						|
    if (formats.constructor !== Array) {
 | 
						|
        formats = [formats];
 | 
						|
    }
 | 
						|
 | 
						|
    var fontconf = {
 | 
						|
        files: config.files,
 | 
						|
        fontName: config.fontName,
 | 
						|
        types: formats,
 | 
						|
        order: formats,
 | 
						|
        fontHeight: config.fontHeight || 1000, // Fixes conversion issues with small svgs
 | 
						|
        templateOptions: {
 | 
						|
            baseClass: config.baseClass || "icon",
 | 
						|
            classPrefix: 'classPrefix' in config ? config.classPrefix : "icon-"
 | 
						|
        },
 | 
						|
        rename: (typeof config.rename == "function" ? config.rename : function (f) {
 | 
						|
            return path.basename(f, ".svg");
 | 
						|
        }),
 | 
						|
        dest: "",
 | 
						|
        writeFiles: false
 | 
						|
    };
 | 
						|
 | 
						|
    if (config.cssTemplate) {
 | 
						|
        fontconf.cssTemplate = absolute(context, config.cssTemplate);
 | 
						|
    }
 | 
						|
 | 
						|
    for (var option in config.templateOptions) {
 | 
						|
        if (config.templateOptions.hasOwnProperty(option)) {
 | 
						|
            fontconf.templateOptions[option] = config.templateOptions[option];
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    // svgicons2svgfont stuff
 | 
						|
    var keys = [
 | 
						|
        "fixedWidth",
 | 
						|
        "centerHorizontally",
 | 
						|
        "normalize",
 | 
						|
        "fontHeight",
 | 
						|
        "round",
 | 
						|
        "descent"
 | 
						|
    ];
 | 
						|
    for (var x in keys) {
 | 
						|
        if (typeof config[keys[x]] != "undefined") {
 | 
						|
            fontconf[keys[x]] = config[keys[x]];
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    var pub = compiler.options.output.publicPath || '/';
 | 
						|
    var embed = !!params.embed;
 | 
						|
 | 
						|
    fontgen(fontconf, function (err, res) {
 | 
						|
        if (err) {
 | 
						|
            return cb(err);
 | 
						|
        }
 | 
						|
        var urls = {};
 | 
						|
        for (var i in formats) {
 | 
						|
            var format = formats[i];
 | 
						|
            if (!embed) {
 | 
						|
                var filename = config.fileName || params.fileName || "[hash]-[fontname][ext]";
 | 
						|
                filename = filename
 | 
						|
                  .replace("[fontname]", fontconf.fontName)
 | 
						|
                  .replace("[ext]", "." + format);
 | 
						|
                var url = loaderUtils.interpolateName(this,
 | 
						|
                  filename,
 | 
						|
                  {
 | 
						|
                      context: params.context || this.context,
 | 
						|
                      content: res[format]
 | 
						|
                  }
 | 
						|
                );
 | 
						|
                urls[format] = path.join(pub, url).replace(/\\/g, '/');
 | 
						|
                emitFile(url, res[format]);
 | 
						|
            } else {
 | 
						|
                urls[format] = 'data:'
 | 
						|
                  + mimeTypes[format]
 | 
						|
                  + ';charset=utf-8;base64,'
 | 
						|
                  + (new Buffer(res[format]).toString('base64'));
 | 
						|
            }
 | 
						|
        }
 | 
						|
        cb(null, res.generateCss(urls));
 | 
						|
    });
 | 
						|
};
 |