const path = require('path');
const webpack = require('webpack');
// const HtmlWebpackPlugin = require('html-webpack-plugin');
// const CleanWebpackPlugin = require('clean-webpack-plugin');
// const CopyWebpackPlugin = require('copy-webpack-plugin');
const {VueLoaderPlugin} = require('vue-loader')
require('babel-loader');
require('ts-loader');
const resolve = relativePath => path.resolve(__dirname, '..', relativePath);

module.exports = {
  mode: 'development',
  entry: {
    'components': './resources/scripts/components/navbar.ts',


    // 'applications/story-time':
    //     './resources/scripts/applications/story-time/main.vue',
    'applications/home': './resources/scripts/applications/home/main.vue',
  },
  output: {
    filename: 'scripts/[name]/app.bundle.js',
    path: path.resolve(__dirname, 'public'),
  },
  module: {
    rules: [
      {
        // vue-loader config to load `.vue` files or single file components.
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          loaders: {
            // https://vue-loader.vuejs.org/guide/scoped-css.html#mixing-local-and-global-styles
            css: [
              'vue-style-loader', {
                loader: 'css-loader',
              }
            ],
            ts: [
              'ts-loader',
            ],
            js: [
              'babel-loader',
            ],
          },
          cacheBusting: true,
        },
      },
      {
        test: /\.tsx?$/,
        use: [
          {loader: 'babel-loader'}, {
            loader: 'ts-loader',
            options: {
              appendTsSuffixTo: [/\.ts\.vue$/],
              appendTsxSuffixTo: [/\.tsx\.vue$/]
            }
          }
        ],
        exclude: /node_modules/
      },
      {
        // This is required for other javascript you are gonna write besides
        // vue.
        test: /\.js$/,
        loader: 'babel-loader',
        include: [
          resolve('src'),
          resolve('node_modules/webpack-dev-server/client'),
        ],
      },
    ]
  },
  plugins: [
    new webpack.NamedModulesPlugin(),
    new VueLoaderPlugin(),
    // Exchanges, adds, or removes modules while an application is running,
    // without a full reload.
    new webpack.HotModuleReplacementPlugin(),
  ],
  resolve: {
    /**
     * The compiler-included build of vue which allows to use vue templates
     * without pre-compiling them
     */
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
    },
    extensions: ['*', '.vue', '.js', '.ts', '.json'],
  },
  // output: {
  //   filename: 'scripts/applications/[name]/[name].bundle.js',
  //   path: path.resolve(__dirname, 'public')
  // },
  watchOptions: {aggregateTimeout: 300, poll: 1000},
  // webpack outputs performance related stuff in the browser.
  performance: {
    hints: false,
  },
  node: {fs: 'empty'}
}
