mirror of
				https://github.com/tobspr/shapez.io.git
				synced 2025-06-13 13:04:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			262 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			262 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // @ts-nocheck
 | |
| 
 | |
| const path = require("path");
 | |
| const webpack = require("webpack");
 | |
| const { getRevision, getVersion, getAllResourceImages } = require("./buildutils");
 | |
| const lzString = require("lz-string");
 | |
| 
 | |
| const TerserPlugin = require("terser-webpack-plugin");
 | |
| const StringReplacePlugin = require("string-replace-webpack-plugin");
 | |
| const UnusedFilesPlugin = require("unused-files-webpack-plugin").UnusedFilesWebpackPlugin;
 | |
| 
 | |
| module.exports = ({
 | |
|     enableAssert = false,
 | |
|     environment,
 | |
|     es6 = false,
 | |
|     standalone = false,
 | |
|     isBrowser = true,
 | |
|     mobileApp = false,
 | |
| }) => {
 | |
|     const globalDefs = {
 | |
|         assert: enableAssert ? "window.assert" : "false && window.assert",
 | |
|         assertAlways: "window.assert",
 | |
|         abstract: "window.assert(false, 'abstract method called');",
 | |
|         G_IS_DEV: "false",
 | |
|         G_IS_RELEASE: environment === "prod" ? "true" : "false",
 | |
|         G_IS_STANDALONE: standalone ? "true" : "false",
 | |
|         G_IS_BROWSER: isBrowser ? "true" : "false",
 | |
|         G_IS_MOBILE_APP: mobileApp ? "true" : "false",
 | |
|         G_TRACKING_ENDPOINT: JSON.stringify(
 | |
|             lzString.compressToEncodedURIComponent("https://tracking.shapez.io/v1")
 | |
|         ),
 | |
|         G_APP_ENVIRONMENT: JSON.stringify(environment),
 | |
|         G_HAVE_ASSERT: enableAssert ? "true" : "false",
 | |
|         G_BUILD_TIME: "" + new Date().getTime(),
 | |
|         G_BUILD_COMMIT_HASH: JSON.stringify(getRevision()),
 | |
|         G_BUILD_VERSION: JSON.stringify(getVersion()),
 | |
|         G_ALL_UI_IMAGES: JSON.stringify(getAllResourceImages()),
 | |
|     };
 | |
| 
 | |
|     const minifyNames = environment === "prod";
 | |
| 
 | |
|     return {
 | |
|         mode: "production",
 | |
|         entry: {
 | |
|             "bundle.js": [path.resolve(__dirname, "..", "src", "js", "main.js")],
 | |
|         },
 | |
|         node: {
 | |
|             fs: "empty",
 | |
|         },
 | |
|         output: {
 | |
|             filename: "bundle.js",
 | |
|             path: path.resolve(__dirname, "..", "build"),
 | |
|         },
 | |
|         context: path.resolve(__dirname, ".."),
 | |
|         stats: {
 | |
|             // Examine all modules
 | |
|             maxModules: Infinity,
 | |
|             // Display bailout reasons
 | |
|             optimizationBailout: true,
 | |
|         },
 | |
|         // devtool: "source-map",
 | |
|         devtool: false,
 | |
|         resolve: {
 | |
|             alias: {
 | |
|                 "global-compression": path.resolve(__dirname, "..", "src", "js", "core", "lzstring.js"),
 | |
|             },
 | |
|         },
 | |
|         optimization: {
 | |
|             minimize: true,
 | |
|             // namedModules: true,
 | |
| 
 | |
|             noEmitOnErrors: true,
 | |
|             removeAvailableModules: true,
 | |
|             removeEmptyChunks: true,
 | |
|             mergeDuplicateChunks: true,
 | |
|             flagIncludedChunks: true,
 | |
|             occurrenceOrder: true,
 | |
|             providedExports: true,
 | |
|             usedExports: true,
 | |
|             concatenateModules: true,
 | |
|             sideEffects: true,
 | |
| 
 | |
|             minimizer: [
 | |
|                 new TerserPlugin({
 | |
|                     parallel: true,
 | |
|                     sourceMap: false,
 | |
|                     cache: false,
 | |
|                     terserOptions: {
 | |
|                         ecma: es6 ? 6 : 5,
 | |
|                         parse: {},
 | |
|                         module: true,
 | |
|                         toplevel: true,
 | |
|                         keep_classnames: !minifyNames,
 | |
|                         keep_fnames: !minifyNames,
 | |
|                         keep_fargs: !minifyNames,
 | |
|                         safari10: true,
 | |
|                         compress: {
 | |
|                             arguments: false, // breaks
 | |
|                             drop_console: false,
 | |
|                             global_defs: globalDefs,
 | |
|                             keep_fargs: !minifyNames,
 | |
|                             keep_infinity: true,
 | |
|                             passes: 2,
 | |
|                             module: true,
 | |
|                             pure_funcs: [
 | |
|                                 "Math.radians",
 | |
|                                 "Math.degrees",
 | |
|                                 "Math.round",
 | |
|                                 "Math.ceil",
 | |
|                                 "Math.floor",
 | |
|                                 "Math.sqrt",
 | |
|                                 "Math.hypot",
 | |
|                                 "Math.abs",
 | |
|                                 "Math.max",
 | |
|                                 "Math.min",
 | |
|                                 "Math.sin",
 | |
|                                 "Math.cos",
 | |
|                                 "Math.tan",
 | |
|                                 "Math.sign",
 | |
|                                 "Math.pow",
 | |
|                                 "Math.atan2",
 | |
|                             ],
 | |
|                             toplevel: true,
 | |
|                             unsafe_math: true,
 | |
|                             unsafe_arrows: false,
 | |
|                             warnings: true,
 | |
|                         },
 | |
|                         mangle: {
 | |
|                             eval: true,
 | |
|                             keep_classnames: !minifyNames,
 | |
|                             keep_fnames: !minifyNames,
 | |
|                             module: true,
 | |
|                             toplevel: true,
 | |
|                             safari10: true,
 | |
|                         },
 | |
|                         output: {
 | |
|                             comments: false,
 | |
|                             ascii_only: true,
 | |
|                             beautify: false,
 | |
|                             braces: false,
 | |
|                             ecma: es6 ? 6 : 5,
 | |
|                             preamble:
 | |
|                                 "/* shapez.io Codebase - Copyright 2020 Tobias Springer - " +
 | |
|                                 getVersion() +
 | |
|                                 " @ " +
 | |
|                                 getRevision() +
 | |
|                                 " */",
 | |
|                         },
 | |
|                     },
 | |
|                 }),
 | |
|             ],
 | |
|         },
 | |
|         performance: {
 | |
|             maxEntrypointSize: 5120000,
 | |
|             maxAssetSize: 5120000,
 | |
|         },
 | |
|         plugins: [
 | |
|             new webpack.DefinePlugin(globalDefs),
 | |
| 
 | |
|             new UnusedFilesPlugin({
 | |
|                 failOnUnused: false,
 | |
|                 cwd: path.join(__dirname, "..", "src", "js"),
 | |
|                 patterns: ["../src/js/**/*.js"],
 | |
|             }),
 | |
|         ],
 | |
|         module: {
 | |
|             rules: [
 | |
|                 {
 | |
|                     test: /\.json$/,
 | |
|                     enforce: "pre",
 | |
|                     use: ["./gulp/loader.compressjson"],
 | |
|                     type: "javascript/auto",
 | |
|                 },
 | |
|                 { test: /\.(png|jpe?g|svg)$/, loader: "ignore-loader" },
 | |
|                 {
 | |
|                     test: /\.js$/,
 | |
|                     enforce: "pre",
 | |
|                     exclude: /node_modules/,
 | |
|                     use: [
 | |
|                         {
 | |
|                             loader: "webpack-strip-block",
 | |
|                             options: {
 | |
|                                 start: "typehints:start",
 | |
|                                 end: "typehints:end",
 | |
|                             },
 | |
|                         },
 | |
|                         {
 | |
|                             loader: "webpack-strip-block",
 | |
|                             options: {
 | |
|                                 start: "dev:start",
 | |
|                                 end: "dev:end",
 | |
|                             },
 | |
|                         },
 | |
|                         {
 | |
|                             loader: "webpack-strip-block",
 | |
|                             options: {
 | |
|                                 start: "wires:start",
 | |
|                                 end: "wires:end",
 | |
|                             },
 | |
|                         },
 | |
|                     ],
 | |
|                 },
 | |
|                 {
 | |
|                     test: /\.js$/,
 | |
|                     use: [
 | |
|                         // "thread-loader",
 | |
|                         {
 | |
|                             loader: "babel-loader?cacheDirectory",
 | |
|                             options: {
 | |
|                                 configFile: require.resolve(
 | |
|                                     es6 ? "./babel-es6.config.js" : "./babel.config.js"
 | |
|                                 ),
 | |
|                             },
 | |
|                         },
 | |
|                         "uglify-template-string-loader", // Finally found this plugin
 | |
|                         StringReplacePlugin.replace({
 | |
|                             replacements: [
 | |
|                                 { pattern: /globalConfig\.tileSize/g, replacement: () => "32" },
 | |
|                                 { pattern: /globalConfig\.halfTileSize/g, replacement: () => "16" },
 | |
|                                 {
 | |
|                                     pattern: /globalConfig\.beltSpeedItemsPerSecond/g,
 | |
|                                     replacement: () => "2.0",
 | |
|                                 },
 | |
|                                 { pattern: /globalConfig\.debug/g, replacement: () => "''" },
 | |
|                             ],
 | |
|                         }),
 | |
|                     ],
 | |
|                 },
 | |
|                 {
 | |
|                     test: /\.worker\.js$/,
 | |
|                     use: [
 | |
|                         {
 | |
|                             loader: "worker-loader",
 | |
|                             options: {
 | |
|                                 fallback: false,
 | |
|                                 inline: true,
 | |
|                             },
 | |
|                         },
 | |
|                         {
 | |
|                             loader: "babel-loader?cacheDirectory",
 | |
|                             options: {
 | |
|                                 configFile: require.resolve(
 | |
|                                     es6 ? "./babel-es6.config.js" : "./babel.config.js"
 | |
|                                 ),
 | |
|                             },
 | |
|                         },
 | |
|                     ],
 | |
|                 },
 | |
|                 {
 | |
|                     test: /\.md$/,
 | |
|                     use: ["html-loader", "markdown-loader"],
 | |
|                 },
 | |
|                 {
 | |
|                     test: /\.ya?ml$/,
 | |
|                     type: "json", // Required by Webpack v4
 | |
|                     use: "yaml-loader",
 | |
|                 },
 | |
|             ],
 | |
|         },
 | |
|     };
 | |
| };
 |