-
-
Notifications
You must be signed in to change notification settings - Fork 435
Description
I have 3 dirs:
- service-worker
- browser
- shared
service-worker
and browser
have their own tsconfig.json
. This is necessary because I need to specify a different lib
compiler option to files in these projects, as they are ran in different environments (service workers and DOM/window/browser, respectively).
I initially thought I could just specify multiple entry points and ts-loader would use the correct tsconfig.json
relative to each entry point. Any files it discovers in the dependency graph of the entry files would use the same configuration as the respective entry file.
Unfortunately this won't work—ts-loader will re-use the first TypeScript instance (and therefore config) it creates for both entry points.
I then discovered ts-loader's instance
option, which forces ts-loader to create different instances. However, the "shared" code is difficult to place: it can be compiled with either TS configs!
In any case, below is what I have ended up with. Have you got any ideas how I could clean this up? Or how this might be made easier in the future?
Ideally, this would be as simple as tsc
makes it. Feed it a configuration file, and it will discover the entry file(s) through files
and compile all files in the dependency graph with the same configuration.
import * as path from 'path';
import * as webpack from 'webpack';
const SOURCE_PATH = path.join(__dirname, '..');
const SHARED_SOURCE_PATH = path.join(SOURCE_PATH, './src/shared');
const BROWSER_SOURCE_PATH = path.join(SOURCE_PATH, './src/browser');
const SERVICE_WORKER_SOURCE_PATH = path.join(SOURCE_PATH, './src/service-worker');
const config: webpack.Configuration = {
devtool: 'source-map',
entry: {
browser: path.join(BROWSER_SOURCE_PATH, './main.ts'),
'service-worker': path.join(SERVICE_WORKER_SOURCE_PATH, './index.ts'),
},
output: {
path: path.join(SOURCE_PATH, './target'),
filename: '[name].js',
},
resolve: {
extensions: [
// start defaults
'.js',
'.json',
// end defaults
'.ts',
],
},
module: {
rules: [
{
test: /\.ts$/,
include: [SHARED_SOURCE_PATH],
loader: 'ts-loader',
options: {
instance: 'shared',
},
},
{
test: /\.ts$/,
include: [BROWSER_SOURCE_PATH],
loader: 'ts-loader',
options: {
instance: 'browser',
},
},
{
test: /\.ts$/,
include: [SERVICE_WORKER_SOURCE_PATH],
loader: 'ts-loader',
options: {
instance: 'service-worker',
},
},
],
},
};
export default config;