UNPKG

2.84 kBJavaScriptView Raw
1/*
2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Tobias Koppers @sokra
4*/
5"use strict";
6
7const { OriginalSource, RawSource } = require("webpack-sources");
8
9const Module = require("./Module");
10const WebpackMissingModule = require("./dependencies/WebpackMissingModule");
11const DelegatedSourceDependency = require("./dependencies/DelegatedSourceDependency");
12const DelegatedExportsDependency = require("./dependencies/DelegatedExportsDependency");
13
14/** @typedef {import("./dependencies/ModuleDependency")} ModuleDependency */
15/** @typedef {import("./util/createHash").Hash} Hash */
16
17class DelegatedModule extends Module {
18 constructor(sourceRequest, data, type, userRequest, originalRequest) {
19 super("javascript/dynamic", null);
20
21 // Info from Factory
22 this.sourceRequest = sourceRequest;
23 this.request = data.id;
24 this.type = type;
25 this.userRequest = userRequest;
26 this.originalRequest = originalRequest;
27 this.delegateData = data;
28
29 // Build info
30 this.delegatedSourceDependency = undefined;
31 }
32
33 libIdent(options) {
34 return typeof this.originalRequest === "string"
35 ? this.originalRequest
36 : this.originalRequest.libIdent(options);
37 }
38
39 identifier() {
40 return `delegated ${JSON.stringify(this.request)} from ${
41 this.sourceRequest
42 }`;
43 }
44
45 readableIdentifier() {
46 return `delegated ${this.userRequest} from ${this.sourceRequest}`;
47 }
48
49 needRebuild() {
50 return false;
51 }
52
53 build(options, compilation, resolver, fs, callback) {
54 this.built = true;
55 this.buildMeta = Object.assign({}, this.delegateData.buildMeta);
56 this.buildInfo = {};
57 this.delegatedSourceDependency = new DelegatedSourceDependency(
58 this.sourceRequest
59 );
60 this.addDependency(this.delegatedSourceDependency);
61 this.addDependency(
62 new DelegatedExportsDependency(this, this.delegateData.exports || true)
63 );
64 callback();
65 }
66
67 source(depTemplates, runtime) {
68 const dep = /** @type {DelegatedSourceDependency} */ (this.dependencies[0]);
69 const sourceModule = dep.module;
70 let str;
71
72 if (!sourceModule) {
73 str = WebpackMissingModule.moduleCode(this.sourceRequest);
74 } else {
75 str = `module.exports = (${runtime.moduleExports({
76 module: sourceModule,
77 request: dep.request
78 })})`;
79
80 switch (this.type) {
81 case "require":
82 str += `(${JSON.stringify(this.request)})`;
83 break;
84 case "object":
85 str += `[${JSON.stringify(this.request)}]`;
86 break;
87 }
88
89 str += ";";
90 }
91
92 if (this.useSourceMap) {
93 return new OriginalSource(str, this.identifier());
94 } else {
95 return new RawSource(str);
96 }
97 }
98
99 size() {
100 return 42;
101 }
102
103 /**
104 * @param {Hash} hash the hash used to track dependencies
105 * @returns {void}
106 */
107 updateHash(hash) {
108 hash.update(this.type);
109 hash.update(JSON.stringify(this.request));
110 super.updateHash(hash);
111 }
112}
113
114module.exports = DelegatedModule;