| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 | 'use strict';const path = require('path');const emojisList = require('emojis-list');const getHashDigest = require('./getHashDigest');const emojiRegex = /[\uD800-\uDFFF]./;const emojiList = emojisList.filter((emoji) => emojiRegex.test(emoji));const emojiCache = {};function encodeStringToEmoji(content, length) {  if (emojiCache[content]) {    return emojiCache[content];  }  length = length || 1;  const emojis = [];  do {    if (!emojiList.length) {      throw new Error('Ran out of emoji');    }    const index = Math.floor(Math.random() * emojiList.length);    emojis.push(emojiList[index]);    emojiList.splice(index, 1);  } while (--length > 0);  const emojiEncoding = emojis.join('');  emojiCache[content] = emojiEncoding;  return emojiEncoding;}function interpolateName(loaderContext, name, options) {  let filename;  const hasQuery =    loaderContext.resourceQuery && loaderContext.resourceQuery.length > 1;  if (typeof name === 'function') {    filename = name(      loaderContext.resourcePath,      hasQuery ? loaderContext.resourceQuery : undefined    );  } else {    filename = name || '[hash].[ext]';  }  const context = options.context;  const content = options.content;  const regExp = options.regExp;  let ext = 'bin';  let basename = 'file';  let directory = '';  let folder = '';  let query = '';  if (loaderContext.resourcePath) {    const parsed = path.parse(loaderContext.resourcePath);    let resourcePath = loaderContext.resourcePath;    if (parsed.ext) {      ext = parsed.ext.substr(1);    }    if (parsed.dir) {      basename = parsed.name;      resourcePath = parsed.dir + path.sep;    }    if (typeof context !== 'undefined') {      directory = path        .relative(context, resourcePath + '_')        .replace(/\\/g, '/')        .replace(/\.\.(\/)?/g, '_$1');      directory = directory.substr(0, directory.length - 1);    } else {      directory = resourcePath.replace(/\\/g, '/').replace(/\.\.(\/)?/g, '_$1');    }    if (directory.length === 1) {      directory = '';    } else if (directory.length > 1) {      folder = path.basename(directory);    }  }  if (loaderContext.resourceQuery && loaderContext.resourceQuery.length > 1) {    query = loaderContext.resourceQuery;    const hashIdx = query.indexOf('#');    if (hashIdx >= 0) {      query = query.substr(0, hashIdx);    }  }  let url = filename;  if (content) {    // Match hash template    url = url      // `hash` and `contenthash` are same in `loader-utils` context      // let's keep `hash` for backward compatibility      .replace(        /\[(?:([^[:\]]+):)?(?:hash|contenthash)(?::([a-z]+\d*))?(?::(\d+))?\]/gi,        (all, hashType, digestType, maxLength) =>          getHashDigest(content, hashType, digestType, parseInt(maxLength, 10))      )      .replace(/\[emoji(?::(\d+))?\]/gi, (all, length) =>        encodeStringToEmoji(content, parseInt(length, 10))      );  }  url = url    .replace(/\[ext\]/gi, () => ext)    .replace(/\[name\]/gi, () => basename)    .replace(/\[path\]/gi, () => directory)    .replace(/\[folder\]/gi, () => folder)    .replace(/\[query\]/gi, () => query);  if (regExp && loaderContext.resourcePath) {    const match = loaderContext.resourcePath.match(new RegExp(regExp));    match &&      match.forEach((matched, i) => {        url = url.replace(new RegExp('\\[' + i + '\\]', 'ig'), matched);      });  }  if (    typeof loaderContext.options === 'object' &&    typeof loaderContext.options.customInterpolateName === 'function'  ) {    url = loaderContext.options.customInterpolateName.call(      loaderContext,      url,      name,      options    );  }  return url;}module.exports = interpolateName;
 |