BaseUriRuntimeModule.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Ivan Kopeykin @vankop
  4. */
  5. "use strict";
  6. const RuntimeGlobals = require("../RuntimeGlobals");
  7. const RuntimeModule = require("../RuntimeModule");
  8. const { renderBaseUri } = require("./baseUri");
  9. /**
  10. * @import {
  11. * EntryDescriptionNormalized as EntryDescription
  12. * } from "../../declarations/WebpackOptions"
  13. */
  14. /** @import Chunk from "../Chunk" */
  15. /** @import Compilation from "../Compilation" */
  16. class BaseUriRuntimeModule extends RuntimeModule {
  17. constructor() {
  18. super("base uri", RuntimeModule.STAGE_ATTACH);
  19. }
  20. /**
  21. * Returns true, if the runtime module should get it's own scope.
  22. * When false, `generate()` must emit complete statements ending with `;`
  23. * so a following runtime IIFE is not parsed as a call (ASI).
  24. * @returns {boolean} true, if the runtime module should get it's own scope
  25. */
  26. shouldIsolate() {
  27. return false;
  28. }
  29. /**
  30. * Generates runtime code for this runtime module.
  31. * @returns {string | null} runtime code
  32. */
  33. generate() {
  34. const chunk = /** @type {Chunk} */ (this.chunk);
  35. const options =
  36. /** @type {EntryDescription} */
  37. (chunk.getEntryOptions());
  38. if (options.baseUri === undefined) {
  39. return `${RuntimeGlobals.baseURI} = undefined;`;
  40. }
  41. const { runtimeTemplate, outputOptions } =
  42. /** @type {Compilation} */
  43. (this.compilation);
  44. // Chunk loading is off here, so no loader has named a base for a relative one to be
  45. // read against. Module output carries its own url; anything else has none to offer.
  46. if (!runtimeTemplate.isModule()) {
  47. return `${RuntimeGlobals.baseURI} = ${JSON.stringify(options.baseUri)};`;
  48. }
  49. return renderBaseUri(
  50. options.baseUri,
  51. `${outputOptions.importMetaName}.url`
  52. );
  53. }
  54. }
  55. module.exports = BaseUriRuntimeModule;