const path = require("path"); const fs = require("fs"); const webpack = require("webpack"); const TerserPlugin = require('terser-webpack-plugin'); function preamble(name) { return [ "/**", " * @license", " * " + name, " * Copyright Daniel Wirtz / The AssemblyScript Authors.", " * SPDX-License-Identifier: Apache-2.0", " */" ].join("\n"); } // Build the C-like library const lib = { mode: "production", target: ["web", "es6"], entry: [ "./src/glue/js", "./src/index.ts" ], module: { rules: [ { test: /\.ts$/, use: "ts-loader", exclude: /node_modules/ } ] }, externals: [ "binaryen" ], resolve: { extensions: [ ".ts", ".js" ] }, output: { filename: "assemblyscript.js", path: path.resolve(__dirname, "dist"), library: "assemblyscript", libraryTarget: "umd", globalObject: "typeof self !== 'undefined' ? self : this" }, devtool: "source-map", performance: { hints : false }, optimization: { minimize: true, minimizer: [ new TerserPlugin({ terserOptions: { output: { comments: false, preamble: preamble("The AssemblyScript Compiler.") } }, parallel: true, extractComments: false }) ], } }; // Build asc for browser usage const shimDir = path.join(__dirname, "cli", "shim"); const bin = { mode: "production", target: ["web", "es6"], context: path.join(__dirname, "cli"), entry: [ "./asc.js" ], externals: [ "binaryen", "assemblyscript" ], node: { global: true }, output: { filename: "asc.js", path: path.resolve(__dirname, "dist"), library: "asc", libraryTarget: "umd", globalObject: "typeof self !== 'undefined' ? self : this" }, devtool: "source-map", performance: { hints : false }, plugins: [ new webpack.DefinePlugin({ BUNDLE_VERSION: JSON.stringify(require("./package.json").version), BUNDLE_LIBRARY: (() => { const libDir = path.join(__dirname, "std", "assembly"); const libFiles = require("glob").sync("**/!(*.d).ts", { cwd: libDir }); const lib = {}; libFiles.forEach(file => lib[file.replace(/\.ts$/, "")] = bundleFile(path.join(libDir, file))); return lib; })(), BUNDLE_DEFINITIONS: { "assembly": bundleFile(path.join(__dirname, "std", "assembly", "index.d.ts")), "portable": bundleFile(path.join(__dirname, "std", "portable", "index.d.ts")) }, __dirname: JSON.stringify(".") }), // Browser shims new webpack.NormalModuleReplacementPlugin(/^path$/, path.join(shimDir, "path")), new webpack.NormalModuleReplacementPlugin(/^process$/, path.join(shimDir, "process")), new webpack.NormalModuleReplacementPlugin(/^fs$/, path.join(shimDir, "fs")) ], optimization: { minimize: true, minimizer: [ new TerserPlugin({ terserOptions: { output: { comments: false, preamble: preamble("The AssemblyScript Compiler Frontend.") } }, parallel: true, extractComments: false }) ], } }; function bundleFile(filename) { return JSON.stringify(fs.readFileSync(filename, { encoding: "utf8" }).replace(/\r\n/g, "\n")); } module.exports = [ lib, bin ];