URLDependency.js (4611B)
1 /* 2 MIT License http://www.opensource.org/licenses/mit-license.php 3 Author Ivan Kopeykin @vankop 4 */ 5 6 "use strict"; 7 8 const RuntimeGlobals = require("../RuntimeGlobals"); 9 const { 10 getDependencyUsedByExportsCondition 11 } = require("../optimize/InnerGraph"); 12 const makeSerializable = require("../util/makeSerializable"); 13 const memoize = require("../util/memoize"); 14 const ModuleDependency = require("./ModuleDependency"); 15 16 /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */ 17 /** @typedef {import("../ChunkGraph")} ChunkGraph */ 18 /** @typedef {import("../Dependency")} Dependency */ 19 /** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */ 20 /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */ 21 /** @typedef {import("../Module")} Module */ 22 /** @typedef {import("../ModuleGraph")} ModuleGraph */ 23 /** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */ 24 /** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */ 25 /** @typedef {import("../util/Hash")} Hash */ 26 /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */ 27 28 const getRawDataUrlModule = memoize(() => require("../asset/RawDataUrlModule")); 29 30 class URLDependency extends ModuleDependency { 31 /** 32 * @param {string} request request 33 * @param {[number, number]} range range of the arguments of new URL( |> ... <| ) 34 * @param {[number, number]} outerRange range of the full |> new URL(...) <| 35 * @param {boolean=} relative use relative urls instead of absolute with base uri 36 */ 37 constructor(request, range, outerRange, relative) { 38 super(request); 39 this.range = range; 40 this.outerRange = outerRange; 41 this.relative = relative || false; 42 /** @type {Set<string> | boolean} */ 43 this.usedByExports = undefined; 44 } 45 46 get type() { 47 return "new URL()"; 48 } 49 50 get category() { 51 return "url"; 52 } 53 54 /** 55 * @param {ModuleGraph} moduleGraph module graph 56 * @returns {null | false | function(ModuleGraphConnection, RuntimeSpec): ConnectionState} function to determine if the connection is active 57 */ 58 getCondition(moduleGraph) { 59 return getDependencyUsedByExportsCondition( 60 this, 61 this.usedByExports, 62 moduleGraph 63 ); 64 } 65 66 /** 67 * @param {string} context context directory 68 * @returns {Module} a module 69 */ 70 createIgnoredModule(context) { 71 const RawDataUrlModule = getRawDataUrlModule(); 72 return new RawDataUrlModule("data:,", `ignored-asset`, `(ignored asset)`); 73 } 74 75 serialize(context) { 76 const { write } = context; 77 write(this.outerRange); 78 write(this.relative); 79 write(this.usedByExports); 80 super.serialize(context); 81 } 82 83 deserialize(context) { 84 const { read } = context; 85 this.outerRange = read(); 86 this.relative = read(); 87 this.usedByExports = read(); 88 super.deserialize(context); 89 } 90 } 91 92 URLDependency.Template = class URLDependencyTemplate extends ( 93 ModuleDependency.Template 94 ) { 95 /** 96 * @param {Dependency} dependency the dependency for which the template should be applied 97 * @param {ReplaceSource} source the current replace source which can be modified 98 * @param {DependencyTemplateContext} templateContext the context object 99 * @returns {void} 100 */ 101 apply(dependency, source, templateContext) { 102 const { 103 chunkGraph, 104 moduleGraph, 105 runtimeRequirements, 106 runtimeTemplate, 107 runtime 108 } = templateContext; 109 const dep = /** @type {URLDependency} */ (dependency); 110 const connection = moduleGraph.getConnection(dep); 111 // Skip rendering depending when dependency is conditional 112 if (connection && !connection.isTargetActive(runtime)) { 113 source.replace( 114 dep.outerRange[0], 115 dep.outerRange[1] - 1, 116 "/* unused asset import */ undefined" 117 ); 118 return; 119 } 120 121 runtimeRequirements.add(RuntimeGlobals.require); 122 123 if (dep.relative) { 124 runtimeRequirements.add(RuntimeGlobals.relativeUrl); 125 source.replace( 126 dep.outerRange[0], 127 dep.outerRange[1] - 1, 128 `/* asset import */ new ${ 129 RuntimeGlobals.relativeUrl 130 }(${runtimeTemplate.moduleRaw({ 131 chunkGraph, 132 module: moduleGraph.getModule(dep), 133 request: dep.request, 134 runtimeRequirements, 135 weak: false 136 })})` 137 ); 138 } else { 139 runtimeRequirements.add(RuntimeGlobals.baseURI); 140 141 source.replace( 142 dep.range[0], 143 dep.range[1] - 1, 144 `/* asset import */ ${runtimeTemplate.moduleRaw({ 145 chunkGraph, 146 module: moduleGraph.getModule(dep), 147 request: dep.request, 148 runtimeRequirements, 149 weak: false 150 })}, ${RuntimeGlobals.baseURI}` 151 ); 152 } 153 } 154 }; 155 156 makeSerializable(URLDependency, "webpack/lib/dependencies/URLDependency"); 157 158 module.exports = URLDependency;