UNPKG

2.77 kBJavaScriptView Raw
1'use strict';
2
3var fs = require('fs');
4var path = require('path');
5var PackageLoadersPlugin = require('webpack-package-loaders-plugin');
6var DeactivateResultSymlinkPlugin = require('./DeactivateResultSymlinkPlugin');
7var IntrospectablePlugin = require('./introspection/plugin');
8var paths = require('../paths');
9
10var BABEL_PRESET = require.resolve('babel-preset-prometheusresearch');
11var INTROSPECTION_LOADER = require.resolve('./introspection/loader');
12
13var entry = [];
14
15// Add dependencies with rex.bundleAll.
16var nodeModules = fs.readdirSync(paths.appNodeModules);
17nodeModules.forEach(pkgName => {
18 var pkgFilename = path.join(paths.appNodeModules, pkgName, 'package.json');
19 if (!fs.existsSync(pkgFilename)) {
20 return;
21 }
22 var pkg = JSON.parse(fs.readFileSync(pkgFilename, 'utf8'));
23 if (pkg.rex && pkg.rex.bundleAll) {
24 entry.push(makeIntrospectableEntry(pkgName, pkgName));
25 }
26});
27
28// Add self if rex.bundleAll
29var pkg = JSON.parse(fs.readFileSync(paths.appPackageJson, 'utf8'));
30if (pkg.rex && pkg.rex.bundleAll) {
31 entry.push(makeIntrospectableEntry(paths.appIndexJs, pkg.name));
32}
33
34function makeIntrospectableEntry(entry, name) {
35 var loaderParams = JSON.stringify({name: name});
36 return `${INTROSPECTION_LOADER}?${loaderParams}!${entry}`;
37}
38
39function injectDefaultLoaders(packageMeta) {
40 if (packageMeta.rex !== undefined && packageMeta.rex.loaders === undefined) {
41 // skip default inject for the root package as it reuses the config from
42 // webpack.config.js
43 if (packageMeta.name === pkg.name) {
44 return [];
45 }
46 if (!packageMeta.rex.forceBabel5) {
47 return [
48 {
49 test: /\.js$/,
50 loader: `babel-loader?presets[]=${BABEL_PRESET}&babelrc=false&cacheDirectory=true`,
51 exclude: /vendor/,
52 }
53 ];
54 } else {
55 return [
56 {
57 test: /\.js$/,
58 loader: 'babel-loader?stage=0',
59 exclude: /vendor/,
60 }
61 ];
62 }
63 } else {
64 return [];
65 }
66}
67
68// Prometheus specific webpack plugins
69var plugins = [
70 // Due to how we symlink dev dependencies we need to deactive symlink
71 // resolution. Newer webpack has it as an option but until we are upgraded we
72 // need to sue this plugin.
73 new DeactivateResultSymlinkPlugin(),
74 // Plugin which allows to require packages by its name at runtime via
75 // __require__(packageName) function.
76 new IntrospectablePlugin(),
77 // Allow packages to configure additional loaders via "rex.loaders" key in
78 // package.json. Also inject babel-loader for packages with "rex" key defined.
79 new PackageLoadersPlugin({
80 packageMeta: ['package.json'],
81 loadersKeyPath: ['rex', 'loaders'],
82 injectLoaders: injectDefaultLoaders,
83 }),
84];
85
86module.exports = {
87 plugins: plugins,
88 entry: entry,
89};