RequestShortener.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const path = require("path");
  7. class RequestShortener {
  8. constructor(directory) {
  9. directory = directory.replace(/\\/g, "/");
  10. if(/[\/\\]$/.test(directory)) directory = directory.substr(0, directory.length - 1);
  11. if(directory) {
  12. const currentDirectoryRegExpString = directory.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
  13. this.currentDirectoryRegExp = new RegExp("^" + currentDirectoryRegExpString + "|(!)" + currentDirectoryRegExpString, "g");
  14. }
  15. const dirname = path.dirname(directory);
  16. const endsWithSeperator = /[\/\\]$/.test(dirname);
  17. const parentDirectory = endsWithSeperator ? dirname.substr(0, dirname.length - 1) : dirname;
  18. if(parentDirectory && parentDirectory !== directory) {
  19. const parentDirectoryRegExpString = parentDirectory.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
  20. this.parentDirectoryRegExp = new RegExp("^" + parentDirectoryRegExpString + "|(!)" + parentDirectoryRegExpString, "g");
  21. }
  22. if(__dirname.length >= 2) {
  23. const buildins = path.join(__dirname, "..").replace(/\\/g, "/");
  24. const buildinsAsModule = this.currentDirectoryRegExp && this.currentDirectoryRegExp.test(buildins);
  25. this.buildinsAsModule = buildinsAsModule;
  26. const buildinsRegExpString = buildins.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
  27. this.buildinsRegExp = new RegExp("^" + buildinsRegExpString + "|(!)" + buildinsRegExpString, "g");
  28. }
  29. this.nodeModulesRegExp = /\/node_modules\//g;
  30. this.indexJsRegExp = /\/index.js(!|\?|\(query\))/g;
  31. }
  32. shorten(request) {
  33. if(!request) return request;
  34. request = request.replace(/\\/g, "/");
  35. if(this.buildinsAsModule && this.buildinsRegExp)
  36. request = request.replace(this.buildinsRegExp, "!(webpack)");
  37. if(this.currentDirectoryRegExp)
  38. request = request.replace(this.currentDirectoryRegExp, "!.");
  39. if(this.parentDirectoryRegExp)
  40. request = request.replace(this.parentDirectoryRegExp, "!..");
  41. if(!this.buildinsAsModule && this.buildinsRegExp)
  42. request = request.replace(this.buildinsRegExp, "!(webpack)");
  43. request = request.replace(this.nodeModulesRegExp, "/~/");
  44. request = request.replace(this.indexJsRegExp, "$1");
  45. return request.replace(/^!|!$/, "");
  46. }
  47. }
  48. module.exports = RequestShortener;