This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
Zaimki/nuxt.config.js

336 lines
14 KiB
JavaScript
Raw Normal View History

2021-09-07 10:11:15 -07:00
require('./src/dotenv')();
2020-11-10 14:41:56 -08:00
import { loadSuml } from './server/loader';
2020-10-13 12:49:08 -07:00
import fs from 'fs';
2022-04-16 04:57:07 -07:00
import path from 'path';
2022-01-03 10:22:10 -08:00
import {buildDict, buildList} from "./src/helpers";
import buildLocaleList from "./src/buildLocaleList";
2020-11-10 14:41:56 -08:00
const config = loadSuml('config');
const translations = loadSuml('translations');
const locale = config.locale;
2020-12-21 11:59:18 -08:00
const locales = buildLocaleList(locale);
const title = translations.title;
const description = translations.description;
2020-11-11 13:07:19 -08:00
const banner = process.env.BASE_URL + '/api/banner/zaimki.png';
2020-07-24 12:15:33 -07:00
const colour = '#C71585';
2022-01-25 13:40:43 -08:00
const logo = fs.readFileSync(__dirname + '/static/logo/logo.svg').toString('utf-8').replace('/></svg>', 'fill="currentColor"/></svg>');
2020-07-22 13:19:23 -07:00
process.env.LOCALE = locale;
if (process.env.ENV) {
process.env.NODE_ENV = process.env.ENV;
}
const allVersionsUrls = buildList(function*() {
if (process.env.NODE_ENV === 'development') {
yield 'http://pronouns.test:3000';
yield 'http://localhost:3000';
} else if (process.env.NODE_ENV === 'test') {
2021-08-29 15:03:59 -07:00
yield 'https://test.pronouns.page';
} else {
yield 'https://pronouns.page';
for (let loc in locales) {
yield locales[loc].url;
}
}
});
process.env.ALL_LOCALES_URLS = allVersionsUrls.join(',');
2020-08-04 07:15:41 -07:00
const bodyParser = require('body-parser');
const buildFlags = () => {
const flags = [];
for (let flag of fs.readdirSync(__dirname + '/static/flags/')) {
let flagDisplay = flag
.replace(new RegExp('\.png$'), '')
.replace(new RegExp('_', 'g'), '')
.trim();
if (flag.startsWith('.') || flag.startsWith('_')) {
continue;
}
if (flag.startsWith('-')) {
const tell = '-' + config.locale + '-';
if (flag.startsWith(tell)) {
flagDisplay = flagDisplay.substring(tell.length);
} else {
continue;
}
}
flags.push([
flag.replace(new RegExp('\.png$'), ''),
flagDisplay,
]);
}
flags.sort((a, b) => a[1].localeCompare(b[1]));
return buildDict(function *() {
for (let [key, display] of flags) {
yield [key, display];
}
});
};
2021-03-02 02:24:23 -08:00
const postCssPlugins = [
require('autoprefixer'),
];
if (config.dir === 'rtl') {
postCssPlugins.push(require('rtlcss'));
}
2022-04-16 04:57:07 -07:00
const getAllFiles = function(dirPath, arrayOfFiles) {
arrayOfFiles = arrayOfFiles || [];
fs.readdirSync(dirPath).forEach(function(file) {
if (fs.statSync(dirPath + '/' + file).isDirectory()) {
arrayOfFiles = getAllFiles(dirPath + '/' + file, arrayOfFiles)
} else {
arrayOfFiles.push(path.join(dirPath, '/', file))
}
})
return arrayOfFiles
}
const jsons = {};
for (let file of getAllFiles(__dirname + '/data/docs')) {
if (!file.endsWith('.json')) { continue; }
jsons[path.relative(__dirname + '/data/docs', file)] = JSON.parse(fs.readFileSync(file));
}
2020-07-22 13:19:23 -07:00
export default {
target: 'server',
head: {
2021-01-22 14:54:24 -08:00
htmlAttrs: {
dir: config.dir || 'ltr',
},
2020-07-22 13:19:23 -07:00
title: title,
meta: [
{ charset: 'utf-8' },
{ hid: 'description', name: 'description', content: description },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ hid: 'apple-mobile-web-app-title', name: 'apple-mobile-web-app-title', content: title },
2020-07-24 12:15:33 -07:00
{ hid: 'theme-color', name: 'theme-color', content: colour },
2020-07-22 13:19:23 -07:00
{ hid: 'og:type', property: 'og:type', content: 'article' },
{ hid: 'og:title', property: 'og:title', content: title },
{ hid: 'og:description', property: 'og:description', content: description },
{ hid: 'og:site_name', property: 'og:site_name', content: title },
2020-11-29 09:36:57 -08:00
{ hid: 'og:image', property: 'og:image', content: banner },
2020-07-22 13:19:23 -07:00
{ hid: 'twitter:card', property: 'twitter:card', content: 'summary_large_image' },
{ hid: 'twitter:title', property: 'twitter:title', content: title },
{ hid: 'twitter:description', property: 'twitter:description', content: description },
{ hid: 'twitter:site', property: 'twitter:site', content: process.env.BASE_URL },
{ hid: 'twitter:image', property: 'twitter:image', content: banner },
],
link: [
2022-01-25 13:40:43 -08:00
{ rel: 'icon', type: 'image/svg', href: '/logo/logo-primary.svg' }
2020-07-22 13:19:23 -07:00
],
},
css: [],
plugins: [
{ src: '~/plugins/vue-matomo.js', ssr: false },
2020-09-28 09:29:13 -07:00
{ src: '~/plugins/globals.js' },
{ src: '~/plugins/auth.js' },
{ src: '~/plugins/datepicker.js', ssr: false },
2020-07-22 13:19:23 -07:00
],
components: true,
buildModules: [],
modules: [
'@nuxtjs/pwa',
2020-08-04 07:15:41 -07:00
'@nuxtjs/axios',
['@nuxtjs/redirect-module', {
rules: config.redirects,
}],
'cookie-universal-nuxt',
2020-07-22 13:19:23 -07:00
],
2020-07-24 12:15:33 -07:00
pwa: {
manifest: {
name: title,
short_name: title,
description: description,
background_color: '#ffffff',
theme_color: colour,
lang: locale,
2020-07-24 12:15:33 -07:00
}
},
build: {
2021-03-01 14:14:42 -08:00
postcss: {
2021-03-02 02:24:23 -08:00
plugins: postCssPlugins,
2021-03-01 14:14:42 -08:00
},
extend (config, ctx) {
config.module.rules.push({
test: /\.csv|\.tsv$/,
loader: 'csv-loader',
options: {
dynamicTyping: true,
header: true,
skipEmptyLines: true,
delimiter: '\t',
}
2020-09-28 05:12:20 -07:00
});
config.module.rules.push({
test: /\.suml$/,
2020-11-13 13:57:23 -08:00
loader: 'suml-loader',
2020-09-28 05:12:20 -07:00
});
2020-11-13 13:57:23 -08:00
config.module.rules.push({
test: /\.md$/,
use: ['html-loader', 'markdown-loader']
})
},
},
2020-07-22 13:19:23 -07:00
env: {
2020-10-13 12:49:08 -07:00
BASE_URL: process.env.BASE_URL,
2021-12-03 08:39:14 -08:00
HOME_URL: process.env.HOME_URL || 'https://pronouns.page',
2020-10-31 13:33:59 -07:00
TITLE: title,
2020-10-13 12:49:08 -07:00
PUBLIC_KEY: fs.readFileSync(__dirname + '/keys/public.pem').toString(),
CONFIG: config,
2020-10-24 12:50:08 -07:00
LOCALE: config.locale,
LOCALES: locales,
FLAGS: buildFlags(),
2021-01-06 06:21:20 -08:00
BUCKET: `https://${process.env.AWS_S3_BUCKET}.s3-${process.env.AWS_REGION}.amazonaws.com`,
2022-04-01 07:22:53 -07:00
CLOUDFRONT: `https://${process.env.AWS_CLOUDFRONT_ID}.cloudfront.net`,
2021-06-09 23:45:13 -07:00
STATS_FILE: process.env.STATS_FILE,
2021-08-07 03:03:49 -07:00
HCAPTCHA_SITEKEY: process.env.HCAPTCHA_SITEKEY,
ALL_LOCALES_URLS: process.env.ALL_LOCALES_URLS,
2022-01-25 13:40:43 -08:00
LOGO: logo,
MIN_AGE: config.ageLimit || 13,
2022-04-16 04:57:07 -07:00
JSONS: JSON.stringify(jsons),
2020-07-22 13:19:23 -07:00
},
serverMiddleware: ['~/server/no-ssr.js', '~/server/index.js'],
2020-08-04 07:15:41 -07:00
axios: {
2021-04-03 13:16:05 -07:00
baseURL: process.env.BASE_URL + '/api',
2020-09-28 05:12:20 -07:00
},
router: {
extendRoutes(routes, resolve) {
2021-08-06 04:30:58 -07:00
if (config.pronouns.enabled) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(config.pronouns.route), component: resolve(__dirname, 'routes/pronouns.vue') });
2021-08-06 04:30:58 -07:00
}
if (config.sources.enabled) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(config.sources.route), component: resolve(__dirname, 'routes/sources.vue') });
}
if (config.nouns.enabled) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(config.nouns.route), component: resolve(__dirname, 'routes/nouns.vue') });
for (let subroute of config.nouns.subroutes || []) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(subroute), component: resolve(__dirname, `data/nouns/${subroute}.vue`) });
}
}
if (config.inclusive.enabled) {
2021-11-16 09:09:09 -08:00
routes.push({path: '/' + encodeURIComponent(config.inclusive.route), component: resolve(__dirname, 'routes/inclusive.vue')});
}
if (config.terminology.enabled) {
2021-11-16 09:09:09 -08:00
routes.push({path: '/' + encodeURIComponent(config.terminology.route), component: resolve(__dirname, 'routes/terminology.vue')});
// TODO remove later
2021-11-16 09:09:09 -08:00
routes.push({path: '/' + encodeURIComponent(config.nouns.route) + '/' + encodeURIComponent(config.terminology.route), component: resolve(__dirname, 'routes/terminology.vue')});
}
2020-09-29 08:59:23 -07:00
if (config.names.enabled) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(config.names.route), component: resolve(__dirname, 'routes/names.vue') });
2020-09-29 08:59:23 -07:00
}
2020-10-10 09:31:31 -07:00
if (config.faq.enabled) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(config.faq.route), component: resolve(__dirname, 'routes/faq.vue') });
2020-10-10 09:31:31 -07:00
}
if (config.links.enabled) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(config.links.route), component: resolve(__dirname, 'routes/links.vue') });
2021-05-13 04:54:13 -07:00
if (config.links.academicRoute) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(config.links.academicRoute), component: resolve(__dirname, 'routes/academic.vue') });
2021-05-13 04:54:13 -07:00
}
if (config.links.mediaRoute) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(config.links.mediaRoute), component: resolve(__dirname, 'routes/media.vue') });
2021-05-13 04:54:13 -07:00
}
}
2021-06-23 10:25:56 -07:00
if (config.links.blog) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(config.links.blogRoute), component: resolve(__dirname, 'routes/blog.vue'), name: 'blog' });
routes.push({ path: '/' + encodeURIComponent(config.links.blogRoute) + '/:slug', component: resolve(__dirname, 'routes/blogEntry.vue'), name: 'blogEntry' });
if (config.blog && config.blog.shortcuts) {
for (let shortcut in config.blog.shortcuts) {
if (!config.blog.shortcuts.hasOwnProperty(shortcut)) { continue; }
const slug = config.blog.shortcuts[shortcut];
routes.push({ path: '/' + encodeURIComponent(shortcut), component: resolve(__dirname, 'routes/blogEntry.vue'), meta: {slug}, name: 'blogEntryShortcut:' + shortcut });
}
}
2021-05-14 07:05:22 -07:00
}
2021-10-21 11:43:57 -07:00
if (config.links.zine && config.links.zine.enabled) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(config.links.zine.route), component: resolve(__dirname, 'routes/zine.vue') });
2021-10-21 11:43:57 -07:00
}
2020-09-29 10:11:46 -07:00
if (config.people.enabled) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(config.people.route), component: resolve(__dirname, 'routes/people.vue') });
2020-09-29 10:11:46 -07:00
}
if (config.english.enabled) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(config.english.route), component: resolve(__dirname, 'routes/english.vue') });
}
if (config.contact.enabled) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(config.contact.route), component: resolve(__dirname, 'routes/contact.vue') });
}
2021-01-12 11:06:59 -08:00
if (config.contact.team.enabled) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(config.contact.team.route), component: resolve(__dirname, 'routes/team.vue') });
2021-01-12 11:06:59 -08:00
}
2020-12-18 02:34:58 -08:00
if (config.census.enabled) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(config.census.route), component: resolve(__dirname, 'routes/census.vue') });
2022-02-17 06:19:33 -08:00
routes.push({ path: '/' + encodeURIComponent(config.census.route) + '/admin', component: resolve(__dirname, 'routes/censusModeration.vue') });
2020-12-18 02:34:58 -08:00
}
2020-10-13 12:49:08 -07:00
if (config.user.enabled) {
2021-11-16 09:09:09 -08:00
routes.push({path: '/' + encodeURIComponent(config.user.route), component: resolve(__dirname, 'routes/user.vue')});
routes.push({path: '/' + encodeURIComponent(config.user.termsRoute), component: resolve(__dirname, 'routes/terms.vue')});
2020-10-13 12:49:08 -07:00
}
2021-09-07 11:01:52 -07:00
routes.push({ path: '/license', component: resolve(__dirname, 'routes/license.vue') });
2020-10-29 15:41:40 -07:00
routes.push({ path: '/admin', component: resolve(__dirname, 'routes/admin.vue') });
2022-04-06 04:52:14 -07:00
routes.push({ path: '/admin/moderation', component: resolve(__dirname, 'routes/adminModeration.vue') });
2020-10-28 08:22:29 -07:00
if (config.profile.enabled) {
routes.push({path: '/u/*', component: resolve(__dirname, 'routes/profile.vue')});
2020-10-28 08:22:29 -07:00
routes.push({path: '/@*', component: resolve(__dirname, 'routes/profile.vue')});
2021-07-10 07:46:29 -07:00
routes.push({path: '/card/@*', component: resolve(__dirname, 'routes/profileCard.vue')});
2020-10-28 08:22:29 -07:00
if (config.profile.editorEnabled) {
routes.push({path: '/editor', component: resolve(__dirname, 'routes/profileEditor.vue')});
2020-10-28 08:22:29 -07:00
}
}
if (config.pronouns.enabled) {
2021-12-23 03:36:54 -08:00
routes.push({ path: `/${encodeURIComponent(config.pronouns.any)}`, component: resolve(__dirname, 'routes/any.vue') });
routes.push({ path: `/${encodeURIComponent(config.pronouns.any)}::group`, component: resolve(__dirname, 'routes/any.vue') });
2021-09-28 12:34:25 -07:00
if (config.pronouns.null && config.pronouns.null.routes) {
for (let route of config.pronouns.null.routes) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(route), component: resolve(__dirname, 'routes/avoiding.vue') });
2021-09-28 12:34:25 -07:00
}
2020-11-29 02:03:01 -08:00
}
2021-11-30 09:50:38 -08:00
if (config.pronouns.mirror) {
routes.push({ path: '/' + encodeURIComponent(config.pronouns.mirror.route), component: resolve(__dirname, 'routes/mirror.vue') });
}
2020-10-28 08:22:29 -07:00
}
2021-08-14 01:42:49 -07:00
if (config.calendar && config.calendar.enabled) {
2021-11-16 09:09:09 -08:00
routes.push({ path: '/' + encodeURIComponent(config.calendar.route), component: resolve(__dirname, 'routes/calendar.vue') });
routes.push({ path: '/' + encodeURIComponent(config.calendar.route) + '/:year(\\d\\d\\d\\d)', component: resolve(__dirname, 'routes/calendar.vue') });
routes.push({ path: '/' + encodeURIComponent(config.calendar.route) + '/:year(\\d\\d\\d\\d)-:month(\\d\\d)-:day(\\d\\d)', component: resolve(__dirname, 'routes/calendarDay.vue') });
2021-08-14 01:42:49 -07:00
}
2021-05-21 09:39:14 -07:00
if (config.api !== null) {
routes.push({ path: '/api', component: resolve(__dirname, 'routes/api.vue') });
}
2020-11-10 14:41:56 -08:00
routes.push({ name: 'all', path: '*', component: resolve(__dirname, 'routes/pronoun.vue') });
},
},
2020-07-22 13:19:23 -07:00
}