1 | const path = require('path');
|
2 |
|
3 | const componentsPath = [path.join(__dirname, 'components')];
|
4 |
|
5 | function resolveLoader(loader) {
|
6 | return require.resolve(`${loader}-loader`);
|
7 | }
|
8 |
|
9 | function loadersObjectToArray(loaders) {
|
10 | return Object.keys(loaders).map(name => loaders[name]);
|
11 | }
|
12 |
|
13 | const svgInlineLoader = {
|
14 | test: /\.svg$/,
|
15 | loader: resolveLoader('svg-inline'),
|
16 | options: {removeSVGTagAttrs: false},
|
17 | include: [require('@jetbrains/icons')]
|
18 | };
|
19 |
|
20 | const svgSpriteLoaderBackwardCompatibilityHack = {
|
21 | get include() {
|
22 | throw new Error(`
|
23 | ***
|
24 | ERROR: Ring UI svgSpriteLoader is REMOVED in 2.0.0. Looks like your webpack config is patching it.
|
25 | The most simple fix is to replace "svgSpriteLoader.include.push(...)" with "svgInlineLoader.include.push(...)"
|
26 | Please consider using your own "svg-inline-loader". More details: https://youtrack.jetbrains.com/issue/RG-1646
|
27 | ***
|
28 | `);
|
29 | }
|
30 | };
|
31 |
|
32 | const svgLoader = {
|
33 | test: /\.svg$/,
|
34 | loader: `${resolveLoader('url')}?limit=10000`,
|
35 | include: componentsPath
|
36 | };
|
37 |
|
38 | const scssLoader = {
|
39 | test: /\.scss$/,
|
40 | include: componentsPath,
|
41 | use: [
|
42 | resolveLoader('style'),
|
43 | resolveLoader('css'),
|
44 | {
|
45 | loader: resolveLoader('postcss')
|
46 | },
|
47 | {
|
48 | loader: `${resolveLoader('sass')}?outputStyle=expanded`,
|
49 | options: {
|
50 | implementation: require('sass')
|
51 | }
|
52 | }
|
53 | ]
|
54 | };
|
55 |
|
56 | const cssLoader = {
|
57 | test: /\.css$/,
|
58 | include: componentsPath,
|
59 | use: [
|
60 | resolveLoader('style'),
|
61 | {
|
62 | loader: resolveLoader('css'),
|
63 | options: {
|
64 | modules: true,
|
65 | importLoaders: 1,
|
66 | localIdentName: '[local]_[hash:3]'
|
67 | }
|
68 | },
|
69 | {
|
70 | loader: resolveLoader('postcss')
|
71 | }
|
72 | ]
|
73 | };
|
74 |
|
75 | const externalCssLoader = {
|
76 | test: /\.css$/,
|
77 | include: [
|
78 | path.dirname(require.resolve('highlight.js/package.json'))
|
79 | ],
|
80 | use: [
|
81 | resolveLoader('style'),
|
82 | resolveLoader('css')
|
83 | ]
|
84 | };
|
85 |
|
86 | const babelLoader = {
|
87 | test: /\.js$/,
|
88 | include: componentsPath,
|
89 | loader: `${resolveLoader('babel')}?${JSON.stringify({
|
90 | configFile: path.join(__dirname, '.babelrc'),
|
91 | cacheDirectory: true
|
92 | })}`
|
93 | };
|
94 |
|
95 | const whatwgLoader = {
|
96 | test: require.resolve('whatwg-fetch'),
|
97 | loader: resolveLoader('imports')
|
98 | };
|
99 |
|
100 | const htmlLoader = {
|
101 | test: /-ng(\\|\/)\S*(-ng|-ng__)\S*\.html$/,
|
102 | include: componentsPath,
|
103 | loader: resolveLoader('html'),
|
104 | query: {
|
105 | collapseBooleanAttributes: false
|
106 | }
|
107 | };
|
108 |
|
109 | const gifLoader = {
|
110 | test: /\.gif$/,
|
111 | include: componentsPath,
|
112 | loader: resolveLoader('url')
|
113 | };
|
114 |
|
115 | const loaders = {
|
116 | svgInlineLoader,
|
117 | svgLoader,
|
118 | cssLoader,
|
119 | externalCssLoader,
|
120 | scssLoader,
|
121 | babelLoader,
|
122 | whatwgLoader,
|
123 | htmlLoader,
|
124 | gifLoader
|
125 | };
|
126 |
|
127 |
|
128 | module.exports = {
|
129 | config: {
|
130 | module: {
|
131 | rules: loadersObjectToArray(loaders)
|
132 | }
|
133 | },
|
134 |
|
135 | componentsPath,
|
136 |
|
137 | loaders: {
|
138 | ...loaders,
|
139 | svgSpriteLoader: svgSpriteLoaderBackwardCompatibilityHack
|
140 | }
|
141 | };
|