import svelte from 'rollup-plugin-svelte'
import resolve from '@rollup/plugin-node-resolve'
import commonjs from '@rollup/plugin-commonjs'
import json from '@rollup/plugin-json'
import livereload from 'rollup-plugin-livereload'
import { terser } from 'rollup-plugin-terser'
import { emptyDirectories, htmlInjector } from 'rollup-plugin-app-utils'

const isProduction = !process.env.ROLLUP_WATCH
const timeStamp = Date.now()

function serve() {
	let server

	function toExit() {
		if (server) server.kill(0)
	}

	return {
		writeBundle() {
			if (server) return
			server = require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], {
				stdio: ['ignore', 'inherit', 'inherit'],
				shell: true
			})

			process.on('SIGTERM', toExit)
			process.on('exit', toExit)
		}
	}
}

export default {
	input: 'src/main.js',
	output: {
		sourcemap: true,
		format: 'iife',
		name: 'app',
		file: 'public/build/bundle.js'
	},
	plugins: [
		emptyDirectories('./public/build/'),
		svelte({
			// enable run-time checks when not in production
			dev: !isProduction,
			// we'll extract any component CSS out into
			// a separate file - better for performance
			// css: css => {
			//	css.write('bundle.css')
			//}
		}),

		// If you have external dependencies installed from
		// npm, you'll most likely need these plugins. In
		// some cases you'll need additional configuration -
		// consult the documentation for details:
		// https://github.com/rollup/plugins/tree/master/packages/commonjs
		resolve({
			browser: true,
			dedupe: ['svelte']
		}),
		commonjs(),

		htmlInjector({
			template: './src/template.html',
			target: './public/index.html',
			injects: { timeStamp },
		}),

		json({
			exclude: ['node_modules/**'],
			preferConst: true,
			compact: true,
			namedExports: false
		}),

		// In dev mode, call `npm run start` once
		// the bundle has been generated
		!isProduction && serve(),

		// Watch the `public` directory and refresh the
		// browser on changes when not in production
		!isProduction && livereload('public'),

		// If we're building for production (npm run build
		// instead of npm run dev), minify
		isProduction && terser()
	],
	watch: {
		clearScreen: false
	}
}