UNPKG

2.22 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 ConstDependency = require("./dependencies/ConstDependency");
8const ParserHelpers = require("./ParserHelpers");
9
10const NullFactory = require("./NullFactory");
11
12/* eslint-disable camelcase */
13const REPLACEMENTS = {
14 __webpack_require__: "__webpack_require__",
15 __webpack_public_path__: "__webpack_require__.p",
16 __webpack_modules__: "__webpack_require__.m",
17 __webpack_chunk_load__: "__webpack_require__.e",
18 __non_webpack_require__: "require",
19 __webpack_nonce__: "__webpack_require__.nc",
20 "require.onError": "__webpack_require__.oe"
21};
22const NO_WEBPACK_REQUIRE = {
23 __non_webpack_require__: true
24};
25const REPLACEMENT_TYPES = {
26 __webpack_public_path__: "string",
27 __webpack_require__: "function",
28 __webpack_modules__: "object",
29 __webpack_chunk_load__: "function",
30 __webpack_nonce__: "string"
31};
32/* eslint-enable camelcase */
33
34class APIPlugin {
35 apply(compiler) {
36 compiler.hooks.compilation.tap(
37 "APIPlugin",
38 (compilation, { normalModuleFactory }) => {
39 compilation.dependencyFactories.set(ConstDependency, new NullFactory());
40 compilation.dependencyTemplates.set(
41 ConstDependency,
42 new ConstDependency.Template()
43 );
44
45 const handler = parser => {
46 Object.keys(REPLACEMENTS).forEach(key => {
47 parser.hooks.expression
48 .for(key)
49 .tap(
50 "APIPlugin",
51 NO_WEBPACK_REQUIRE[key]
52 ? ParserHelpers.toConstantDependency(
53 parser,
54 REPLACEMENTS[key]
55 )
56 : ParserHelpers.toConstantDependencyWithWebpackRequire(
57 parser,
58 REPLACEMENTS[key]
59 )
60 );
61 parser.hooks.evaluateTypeof
62 .for(key)
63 .tap(
64 "APIPlugin",
65 ParserHelpers.evaluateToString(REPLACEMENT_TYPES[key])
66 );
67 });
68 };
69
70 normalModuleFactory.hooks.parser
71 .for("javascript/auto")
72 .tap("APIPlugin", handler);
73 normalModuleFactory.hooks.parser
74 .for("javascript/dynamic")
75 .tap("APIPlugin", handler);
76 normalModuleFactory.hooks.parser
77 .for("javascript/esm")
78 .tap("APIPlugin", handler);
79 }
80 );
81 }
82}
83
84module.exports = APIPlugin;