summaryrefslogtreecommitdiff
path: root/webpack.config.ts
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2018-03-15 05:26:24 +0900
committersyuilo <syuilotan@yahoo.co.jp>2018-03-15 05:26:24 +0900
commit94b5729c8474a502e1cf390b539339b09c6a7a94 (patch)
treed2fd9445d727d04c79d5efdc0fe7901b5a229692 /webpack.config.ts
parentUpdate dependencies :rocket: (diff)
downloadmisskey-94b5729c8474a502e1cf390b539339b09c6a7a94.tar.gz
misskey-94b5729c8474a502e1cf390b539339b09c6a7a94.tar.bz2
misskey-94b5729c8474a502e1cf390b539339b09c6a7a94.zip
:v:
Diffstat (limited to 'webpack.config.ts')
-rw-r--r--webpack.config.ts237
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'
+ };
+});