1 | import DuplicateCheckerPlugin from "duplicate-package-checker-webpack-plugin";
|
2 | import FriendlyErrorsPlugin from "friendly-errors-webpack-plugin";
|
3 | import LodashPlugin from "lodash-webpack-plugin";
|
4 | import MomentLocalesPlugin from "moment-locales-webpack-plugin";
|
5 | import MomentTimezoneDataPlugin from "moment-timezone-data-webpack-plugin";
|
6 | import { join } from "path";
|
7 | import SpeedMeasurePlugin from "speed-measure-webpack-plugin";
|
8 | import webpack from "webpack";
|
9 | import { progressPlugin } from "./progressPlugin";
|
10 | import { SizePlugin } from "./sizePlugin";
|
11 | export function createPlugins(configuration, dev, modulePaths) {
|
12 | const importOptimizations = [
|
13 | configuration.bundleOptions.includeBusboyEncodings !== true
|
14 | ? new webpack.NormalModuleReplacementPlugin(/encoding-indexes/, (resource) => {
|
15 | if (/busboy/.test(resource.context)) {
|
16 | resource.request = require.resolve("./replacements/busboy/encoding-indexes", {
|
17 | paths: [__dirname]
|
18 | });
|
19 | }
|
20 | })
|
21 | : null,
|
22 | new webpack.NormalModuleReplacementPlugin(/iconv-lite[\/\\]encodings[\/\\]/, (resource) => {
|
23 | if (/iconv-lite/.test(resource.context)) {
|
24 | if (/iconv-lite[\/\\]encodings[\/\\]index/.test(resource.request)) {
|
25 | resource.request = require.resolve("./replacements/iconv-lite/encodings", {
|
26 | paths: [__dirname]
|
27 | });
|
28 | }
|
29 | else if (/iconv-lite[\/\\]encodings[\/\\]/.test(resource.request)) {
|
30 | const [, request] = /iconv-lite[\/\\]encodings[\/\\](.*)/.exec(resource.request);
|
31 | if (!(/internal\.js/.test(request) ||
|
32 | (configuration.bundleOptions.allowedIconvLiteEncodings != null
|
33 | ? configuration.bundleOptions.allowedIconvLiteEncodings.some(re => new RegExp(re).test(request))
|
34 | : false))) {
|
35 | resource.request = require.resolve("./replacements/iconv-lite/noop", {
|
36 | paths: [__dirname]
|
37 | });
|
38 | }
|
39 | }
|
40 | }
|
41 | }),
|
42 | new LodashPlugin(),
|
43 | new MomentLocalesPlugin({
|
44 | localesToKeep: configuration.bundleOptions.momentLocales || []
|
45 | }),
|
46 | configuration.bundleOptions.momentTimezones != null
|
47 | ? new MomentTimezoneDataPlugin({
|
48 | startYear: configuration.bundleOptions.momentTimezones.startYear,
|
49 | endYear: configuration.bundleOptions.momentTimezones.endYear,
|
50 | matchZones: configuration.bundleOptions.momentTimezones.matchZones
|
51 | })
|
52 | : null,
|
53 | process.env.WEBPACK_ANALYZE === "true"
|
54 | ? new DuplicateCheckerPlugin({
|
55 | verbose: true,
|
56 | showHelp: true,
|
57 | strict: true
|
58 | })
|
59 | : null
|
60 | ];
|
61 | const profiling = [
|
62 | process.env.WEBPACK_PROFILE === "true"
|
63 | ? new SpeedMeasurePlugin({
|
64 | outputFormat: "humanVerbose"
|
65 | })
|
66 | : null,
|
67 | process.env.WEBPACK_PROFILE === "true"
|
68 | ? new webpack.debug.ProfilingPlugin({
|
69 | outputPath: join(configuration.outputDir, "./profile.json")
|
70 | })
|
71 | : null,
|
72 | process.env.WEBPACK_BUNDLE_ANALYZE === "true" ? new SizePlugin() : null,
|
73 | progressPlugin()
|
74 | ];
|
75 | const loadVersion = (versionDir) => {
|
76 | if (versionDir != null) {
|
77 | try {
|
78 | return require(join(versionDir, "./package.json")).version;
|
79 | }
|
80 | catch (err) {
|
81 | return false;
|
82 | }
|
83 | }
|
84 | return false;
|
85 | };
|
86 | const versions = {
|
87 | "@excitare/cli": loadVersion(modulePaths.cliPath),
|
88 | "@excitare/entry-next": loadVersion(modulePaths.entryNextDir),
|
89 | "@excitare/entry-service": loadVersion(modulePaths.entryServiceDir),
|
90 | "@excitare/client-next": loadVersion(modulePaths.clientDir),
|
91 | "@excitare/routes": loadVersion(modulePaths.routesDir),
|
92 | "next-server": loadVersion(modulePaths.nextServerPath),
|
93 | next: loadVersion(modulePaths.nextPath),
|
94 | react: loadVersion(modulePaths.reactDir),
|
95 | "react-dom": loadVersion(modulePaths.reactDomDir)
|
96 | };
|
97 | return [
|
98 | ...importOptimizations,
|
99 | ...(!dev ? profiling : []),
|
100 | new FriendlyErrorsPlugin({
|
101 | compilationSuccessInfo: {
|
102 |
|
103 |
|
104 | },
|
105 | clearConsole: false,
|
106 | additionalFormatters: [],
|
107 | additionalTransformers: []
|
108 | }),
|
109 | new webpack.DefinePlugin({
|
110 | "process.env.NODE_ENV": JSON.stringify(dev ? "development" : "production"),
|
111 | "process.env.excitareVersions": JSON.stringify(JSON.stringify(versions)),
|
112 | "process.iconOptions": configuration.iconOptions
|
113 | ? JSON.stringify(configuration.iconOptions)
|
114 | : JSON.stringify("null")
|
115 | })
|
116 | ];
|
117 | }
|
118 |
|
\ | No newline at end of file |