/* * ⚠️⚠️⚠️ THIS FILE WAS SCAFFOLDED BY `@grafana/create-plugin`. DO NOT EDIT THIS FILE DIRECTLY. ⚠️⚠️⚠️ * * In order to extend the configuration follow the steps in .config/README.md */ import CopyWebpackPlugin from 'copy-webpack-plugin'; import ESLintPlugin from 'eslint-webpack-plugin'; import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin'; import LiveReloadPlugin from 'webpack-livereload-plugin'; import path from 'path'; import ReplaceInFileWebpackPlugin from 'replace-in-file-webpack-plugin'; import { Configuration } from 'webpack'; import { getPackageJson, getPluginId, hasReadme, getEntries } from './utils'; import { SOURCE_DIR, DIST_DIR } from './constants'; const config = async (env): Promise => ({ cache: { type: 'filesystem', buildDependencies: { config: [__filename], }, }, context: path.join(process.cwd(), SOURCE_DIR), devtool: env.production ? 'source-map' : 'eval-source-map', entry: await getEntries(), externals: [ 'lodash', 'jquery', 'moment', 'slate', 'emotion', '@emotion/react', '@emotion/css', 'prismjs', 'slate-plain-serializer', '@grafana/slate-react', 'react', 'react-dom', 'react-redux', 'redux', 'rxjs', 'react-router-dom', 'd3', 'angular', '@grafana/ui', '@grafana/runtime', '@grafana/data', // Mark legacy SDK imports as external if their name starts with the "grafana/" prefix ({ request }, callback) => { const prefix = 'grafana/'; const hasPrefix = (request) => request.indexOf(prefix) === 0; const stripPrefix = (request) => request.substr(prefix.length); if (hasPrefix(request)) { return callback(null, stripPrefix(request)); } callback(); }, ], mode: env.production ? 'production' : 'development', module: { rules: [ { exclude: /(node_modules)/, test: /\.[tj]sx?$/, use: { loader: 'swc-loader', options: { jsc: { baseUrl: './src', target: 'es2015', loose: false, parser: { syntax: 'typescript', tsx: true, decorators: false, dynamicImport: true, }, }, }, }, }, { test: /\.(png|jpe?g|gif|svg)$/, use: [ { loader: 'asset/resource', options: { outputPath: '/', name: Boolean(env.production) ? '[path][hash].[ext]' : '[path][name].[ext]', }, }, ], }, { test: /\.(woff|woff2|eot|ttf|otf)(\?v=\d+\.\d+\.\d+)?$/, loader: 'asset/resource', options: { // Keep publicPath relative for host.com/grafana/ deployments publicPath: `public/plugins/${getPluginId()}/fonts`, outputPath: 'fonts', name: Boolean(env.production) ? '[hash].[ext]' : '[name].[ext]', }, }, ], }, output: { clean: true, filename: '[name].js', libraryTarget: 'amd', path: path.resolve(process.cwd(), DIST_DIR), publicPath: '/', }, plugins: [ new CopyWebpackPlugin({ patterns: [ // If src/README.md exists use it; otherwise the root README // To `compiler.options.output` { from: hasReadme() ? 'README.md' : '../README.md', to: '.', force: true }, { from: 'plugin.json', to: '.' }, { from: '../LICENSE', to: '.' }, { from: '../CHANGELOG.md', to: '.', force: true }, { from: '**/*.json', to: '.' }, // TODO { from: '**/*.svg', to: '.', noErrorOnMissing: true }, // Optional { from: '**/*.png', to: '.', noErrorOnMissing: true }, // Optional { from: '**/*.html', to: '.', noErrorOnMissing: true }, // Optional { from: 'img/**/*', to: '.', noErrorOnMissing: true }, // Optional { from: 'libs/**/*', to: '.', noErrorOnMissing: true }, // Optional { from: 'static/**/*', to: '.', noErrorOnMissing: true }, // Optional ], }), // Replace certain template-variables in the README and plugin.json new ReplaceInFileWebpackPlugin([ { dir: DIST_DIR, files: ['plugin.json', 'README.md'], rules: [ { search: /\%VERSION\%/g, replace: getPackageJson().version, }, { search: /\%TODAY\%/g, replace: new Date().toISOString().substring(0, 10), }, { search: /\%PLUGIN_ID\%/g, replace: getPluginId(), }, ], }, ]), new ForkTsCheckerWebpackPlugin({ async: Boolean(env.development), issue: { include: [{ file: '**/*.{ts,tsx}' }], }, typescript: { configFile: path.join(process.cwd(), 'tsconfig.json') }, }), new ESLintPlugin({ extensions: ['.ts', '.tsx'], lintDirtyModulesOnly: Boolean(env.development), // don't lint on start, only lint changed files }), ...(env.development ? [new LiveReloadPlugin()] : []), ], resolve: { extensions: ['.js', '.jsx', '.ts', '.tsx'], unsafeCache: true, }, }); export default config;