/* eslint-disable @typescript-eslint/no-var-requires */ const HtmlWebpackPlugin = require('html-webpack-plugin'); const path = require('path'); const InlineChunkHtmlPlugin = require('react-dev-utils/InlineChunkHtmlPlugin'); const webpack = require('webpack'); module.exports = (env, argv) => ({ mode: argv.mode === 'production' ? 'production' : 'development', // This is necessary because Figma's 'eval' works differently than normal eval devtool: argv.mode === 'production' ? false : 'inline-source-map', entry: { ui: './src/ui.tsx', // The entry point for your UI code code: './src/code.ts' // The entry point for your plugin code }, module: { rules: [ // Converts TypeScript code to JavaScript { test: /\.tsx?$/, use: 'ts-loader', exclude: /node_modules/ }, // Enables including CSS by doing "import './file.css'" in your TypeScript code { test: /\.css$/, use: ['style-loader', 'css-loader'] }, // Allows you to use "<%= require('./file.svg') %>" in your HTML code to get a data URI // { test: /\.(png|jpg|gif|webp|svg|zip)$/, loader: [{ loader: 'url-loader' }] } { test: /\.svg/, type: 'asset/inline' } ] }, // Webpack tries these extensions for you if you omit the extension like "import './file'" resolve: { extensions: ['.tsx', '.ts', '.jsx', '.js'], fallback: { crypto: false } }, output: { filename: '[name].js', path: path.resolve(__dirname, 'dist') // Compile into a folder called "dist" }, // Tells Webpack to generate "ui.html" and to inline "ui.ts" into it plugins: [ new webpack.DefinePlugin({ global: {} // Fix missing symbol error when running in developer VM }), new HtmlWebpackPlugin({ inject: 'body', template: './src/ui.html', filename: 'ui.html', chunks: ['ui'] }), new InlineChunkHtmlPlugin(HtmlWebpackPlugin, [/ui/]) ] });