This repository has been archived by the owner on Jun 13, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathwebpack.common.js
123 lines (114 loc) · 3.09 KB
/
webpack.common.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
const CleanWebpackPlugin = require('clean-webpack-plugin')
const HtmlWebPackPlugin = require("html-webpack-plugin")
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const path = require('path')
const fs = require('fs')
const yaml = require('js-yaml')
const showdown = require('showdown')
const md = new showdown.Converter()
const cloneDeep = require('lodash/cloneDeep')
const handlebars = require('handlebars')
// apply markdown filter recursively as needed
function formatStrings(data, isMarkdown=false) {
let parsedData = cloneDeep(data)
if (Array.isArray(data)) {
parsedData = data.map(formatStrings)
}
else if (typeof(data) === 'object') {
for (let key of Object.keys(data)) {
if (data[key]) {
parsedData[key] = formatStrings(data[key], key.match(/_html$/))
}
}
}
else if (isMarkdown) {
parsedData = md.makeHtml(data)
}
return parsedData
}
function loadStrings(languageCode) {
const stringsFile = path.resolve(__dirname, 'src', 'strings', `${languageCode}.yml`)
const strings = yaml.safeLoad(fs.readFileSync(stringsFile, 'utf8'))
return formatStrings(strings)
}
function HandlebarsPlugin(options) {
options = options || {};
this.template = options.template;
}
HandlebarsPlugin.prototype.apply = function(compiler) {
compiler.hooks.compilation.tap('HandlebarsPlugin', function (compilation) {
compilation.hooks.htmlWebpackPluginBeforeHtmlProcessing.tapAsync('HandlebarsPlugin', function (data, callback) {
const template = handlebars.compile(data.html)
const strings = loadStrings(data.plugin.options.language)
data.html = template(strings)
callback(null, data)
});
});
}
const extractSass = new ExtractTextPlugin({
filename: "app.[hash].css",
disable: process.env.NODE_ENV === "development"
});
module.exports = {
entry: './src/index.js',
output: {
filename: "app.[hash].js",
path: path.resolve(__dirname, './dist')
},
module: {
rules: [
{
test: /\.js$/,
exclude: [
/node_modules/
],
use: {
loader: "babel-loader",
query: {
presets: ['es2015', 'stage-0']
}
},
}, {
test: /\.(s*)css$/,
use: extractSass.extract({
fallback: 'style-loader',
use: ['css-loader', 'sass-loader']
})
}, {
test: /\.html$/,
use: [
{
loader: "html-loader",
options: {
minimize: true
}
}
]
},
{
test: /\.svg$/,
loader: 'svg-inline-loader'
}
]
},
plugins: [
new CleanWebpackPlugin(['dist']),
new HtmlWebPackPlugin({
template: './src/index.html',
inlineSource: '.(js|css)$',
language: 'en'
}),
new HtmlWebPackPlugin({
template: './src/index.html',
inlineSource: '.(js|css)$',
language: 'es',
filename: 'index-es.html'
}),
new HandlebarsPlugin(),
new CopyWebpackPlugin([
{ from: 'static' }
]),
extractSass,
]
};