diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2018-03-15 05:26:24 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2018-03-15 05:26:24 +0900 |
| commit | 94b5729c8474a502e1cf390b539339b09c6a7a94 (patch) | |
| tree | d2fd9445d727d04c79d5efdc0fe7901b5a229692 /webpack.config.ts | |
| parent | Update dependencies :rocket: (diff) | |
| download | misskey-94b5729c8474a502e1cf390b539339b09c6a7a94.tar.gz misskey-94b5729c8474a502e1cf390b539339b09c6a7a94.tar.bz2 misskey-94b5729c8474a502e1cf390b539339b09c6a7a94.zip | |
:v:
Diffstat (limited to 'webpack.config.ts')
| -rw-r--r-- | webpack.config.ts | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/webpack.config.ts b/webpack.config.ts new file mode 100644 index 0000000000..f24160c55a --- /dev/null +++ b/webpack.config.ts @@ -0,0 +1,237 @@ +/** + * webpack configuration + */ + +import * as fs from 'fs'; +import * as webpack from 'webpack'; +import chalk from 'chalk'; +import jsonImporter from 'node-sass-json-importer'; +const minify = require('html-minifier').minify; +const WebpackOnBuildPlugin = require('on-build-webpack'); +const HardSourceWebpackPlugin = require('hard-source-webpack-plugin'); +const ProgressBarPlugin = require('progress-bar-webpack-plugin'); +import I18nReplacer from './src/common/build/i18n'; +import { pattern as faPattern, replacement as faReplacement } from './src/common/build/fa'; +const constants = require('./src/const.json'); +import config from './src/conf'; +import { licenseHtml } from './src/common/build/license'; + +import langs from './locales'; +const meta = require('./package.json'); +const version = meta.version; + +const env = process.env.NODE_ENV; +const isProduction = env === 'production'; + +global['faReplacement'] = faReplacement; + +global['collapseSpacesReplacement'] = html => { + return minify(html, { + collapseWhitespace: true, + collapseInlineTagWhitespace: true, + keepClosingSlash: true + }).replace(/\t/g, ''); +}; + +global['base64replacement'] = (_, key) => { + return fs.readFileSync(__dirname + '/src/web/' + key, 'base64'); +}; + +module.exports = Object.keys(langs).map(lang => { + // Chunk name + const name = lang; + + // Entries + const entry = { + desktop: './src/web/app/desktop/script.ts', + mobile: './src/web/app/mobile/script.ts', + //ch: './src/web/app/ch/script.ts', + //stats: './src/web/app/stats/script.ts', + //status: './src/web/app/status/script.ts', + dev: './src/web/app/dev/script.ts', + auth: './src/web/app/auth/script.ts', + sw: './src/web/app/sw.js' + }; + + const output = { + path: __dirname + '/built/web/assets', + filename: `[name].${version}.${lang}.js` + }; + + const i18nReplacer = new I18nReplacer(lang); + global['i18nReplacement'] = i18nReplacer.replacement; + + //#region Define consts + const consts = { + _RECAPTCHA_SITEKEY_: config.recaptcha.site_key, + _SW_PUBLICKEY_: config.sw ? config.sw.public_key : null, + _THEME_COLOR_: constants.themeColor, + _COPYRIGHT_: constants.copyright, + _VERSION_: version, + _STATUS_URL_: config.status_url, + _STATS_URL_: config.stats_url, + _DOCS_URL_: config.docs_url, + _API_URL_: config.api_url, + _DEV_URL_: config.dev_url, + _CH_URL_: config.ch_url, + _LANG_: lang, + _HOST_: config.host, + _URL_: config.url, + _LICENSE_: licenseHtml, + _GOOGLE_MAPS_API_KEY_: config.google_maps_api_key + }; + + const _consts = {}; + + Object.keys(consts).forEach(key => { + _consts[key] = JSON.stringify(consts[key]); + }); + //#endregion + + const plugins = [ + new HardSourceWebpackPlugin(), + new ProgressBarPlugin({ + format: chalk` {cyan.bold yes we can} {bold [}:bar{bold ]} {green.bold :percent} {gray (:current/:total)} :elapseds`, + clear: false + }), + new webpack.DefinePlugin(_consts), + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify(process.env.NODE_ENV) + } + }), + new WebpackOnBuildPlugin(stats => { + fs.writeFileSync('./version.json', JSON.stringify({ + version + }), 'utf-8'); + }) + ]; + + if (isProduction) { + plugins.push(new webpack.optimize.ModuleConcatenationPlugin()); + plugins.push(minify()); + } + + return { + name, + entry, + module: { + rules: [{ + test: /\.vue$/, + exclude: /node_modules/, + use: [{ + loader: 'vue-loader', + options: { + cssSourceMap: false, + preserveWhitespace: false + } + }, { + loader: 'replace', + query: { + search: /%base64:(.+?)%/g.toString(), + replace: 'base64replacement' + } + }, { + loader: 'replace', + query: { + search: i18nReplacer.pattern.toString(), + replace: 'i18nReplacement' + } + }, { + loader: 'replace', + query: { + search: faPattern.toString(), + replace: 'faReplacement' + } + }, { + loader: 'replace', + query: { + search: /^<template>([\s\S]+?)\r?\n<\/template>/.toString(), + replace: 'collapseSpacesReplacement' + } + }] + }, { + test: /\.styl$/, + exclude: /node_modules/, + use: [{ + loader: 'style-loader' + }, { + loader: 'css-loader', + options: { + minimize: true + } + }, { + loader: 'stylus-loader' + } + ] + }, { + test: /\.scss$/, + exclude: /node_modules/, + use: [{ + loader: 'style-loader' + }, { + loader: 'css-loader', + options: { + minimize: true + } + }, { + loader: 'sass-loader', + options: { + importer: jsonImporter, + } + }] + }, { + test: /\.css$/, + use: [{ + loader: 'style-loader' + }, { + loader: 'css-loader', + options: { + minimize: true + } + }] + }, { + test: /\.(eot|woff|woff2|svg|ttf)([\?]?.*)$/, + loader: 'url-loader' + }, { + test: /\.ts$/, + exclude: /node_modules/, + use: [{ + loader: 'ts-loader', + options: { + happyPackMode: true, + configFile: __dirname + '/../src/web/app/tsconfig.json', + appendTsSuffixTo: [/\.vue$/] + } + }, { + loader: 'replace', + query: { + search: i18nReplacer.pattern.toString(), + replace: 'i18nReplacement' + } + }, { + loader: 'replace', + query: { + search: faPattern.toString(), + replace: 'faReplacement' + } + }] + }] + }, + plugins, + output, + resolve: { + extensions: [ + '.js', '.ts', '.json' + ], + alias: { + 'const.styl': __dirname + '/src/web/const.styl' + } + }, + resolveLoader: { + modules: ['node_modules', './webpack/loaders'] + }, + cache: true, + devtool: 'source-map' + }; +}); |