build(frontend): create well-known based on new i18n.json
This commit is contained in:
parent
793ed1af32
commit
734c82eff7
5
config/i18n.json
Normal file
5
config/i18n.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"_i18n": true,
|
||||||
|
"de-de-formal": "Ein webbasiertes Schulungsverwaltungssystem",
|
||||||
|
"en-eu": "A web-based training management system"
|
||||||
|
}
|
||||||
@ -29,10 +29,14 @@ import webpackJson from 'webpack/package.json' assert { type: "json" };
|
|||||||
const webpackVersion = webpackJson.version.split('.').slice(0, 2).join('.');
|
const webpackVersion = webpackJson.version.split('.').slice(0, 2).join('.');
|
||||||
import packageJson from './package.json' assert { type: "json" };
|
import packageJson from './package.json' assert { type: "json" };
|
||||||
const packageVersion = packageJson.version;
|
const packageVersion = packageJson.version;
|
||||||
|
import i18nJson from './config/i18n.json' assert { type: 'json' };
|
||||||
|
|
||||||
async function webpackConfig() {
|
async function webpackConfig() {
|
||||||
const wellKnownCacheDir = resolve('.cache/well-known');
|
const wellKnownDir = 'well-known';
|
||||||
const assetsDirectory = resolve('assets');
|
const wellKnownCacheDir = '.cache/well-known';
|
||||||
|
const staticDir = 'static';
|
||||||
|
const assetsDir = 'assets';
|
||||||
|
const faviconsDir = `${assetsDir}/favicons`;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
module: {
|
module: {
|
||||||
@ -118,8 +122,8 @@ async function webpackConfig() {
|
|||||||
serialize: yaml.dump
|
serialize: yaml.dump
|
||||||
}),
|
}),
|
||||||
new CleanWebpackPlugin({
|
new CleanWebpackPlugin({
|
||||||
cleanOnceBeforeBuildPatterns: [ resolve('static'),
|
cleanOnceBeforeBuildPatterns: [ resolve(staticDir),
|
||||||
resolve('well-known'),
|
resolve(wellKnownDir),
|
||||||
]
|
]
|
||||||
}),
|
}),
|
||||||
new webpack.IgnorePlugin({
|
new webpack.IgnorePlugin({
|
||||||
@ -129,47 +133,28 @@ async function webpackConfig() {
|
|||||||
new webpack.DefinePlugin({
|
new webpack.DefinePlugin({
|
||||||
VERSION: JSON.stringify(packageVersion)
|
VERSION: JSON.stringify(packageVersion)
|
||||||
}),
|
}),
|
||||||
/* TODO: deprecated due to removal of online favicon generation; is this still needed?
|
|
||||||
...(() => {
|
...(() => {
|
||||||
const langs = new Set();
|
const langs = new Set();
|
||||||
function findLangs(json) {
|
function findLangs(json, langs = new Set()) {
|
||||||
if (json && json._i18n) {
|
if (json && json._i18n) {
|
||||||
Object.keys(json).forEach(key => {
|
Object.keys(json).forEach(key => {
|
||||||
if (key !== '_i18n') {
|
if (key !== '_i18n') {
|
||||||
langs.add(key);
|
langs.add(key);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
} else if (Array.isArray(json)) {
|
|
||||||
json.forEach(elem => findLangs(elem));
|
|
||||||
} else if (typeof json === 'object') {
|
|
||||||
Object.keys(json).forEach(key => findLangs(json[key]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
findLangs(faviconJson);
|
|
||||||
|
|
||||||
function selectLang(lang, json) {
|
|
||||||
if (json && json._i18n) {
|
|
||||||
return json[lang];
|
|
||||||
} else if (Array.isArray(json)) {
|
|
||||||
return json.map(elem => selectLang(lang, elem));
|
|
||||||
} else if (typeof json === 'object') {
|
|
||||||
return Object.fromEntries(Object.entries(json).map(([k, v]) => [k, selectLang(lang, v)]));
|
|
||||||
} else {
|
} else {
|
||||||
return json;
|
console.error('Invalid i18nJson format!');
|
||||||
}
|
}
|
||||||
|
return langs;
|
||||||
}
|
}
|
||||||
|
findLangs(i18nJson, langs);
|
||||||
const langJsons = {};
|
|
||||||
Array.from(langs).forEach(lang => {
|
|
||||||
langJsons[lang] = selectLang(lang, faviconJson);
|
|
||||||
});
|
|
||||||
|
|
||||||
const cacheHash = crypto.createHash('sha256');
|
const cacheHash = crypto.createHash('sha256');
|
||||||
cacheHash.update(JSON.stringify(langJsons));
|
cacheHash.update(JSON.stringify(langs));
|
||||||
|
|
||||||
const cacheFiles = new Set([
|
const cacheFiles = new Set([
|
||||||
...(Array.from(langs).map(lang => resolve(langJsons[lang].masterPicture))),
|
|
||||||
resolve('config/robots.txt'),
|
resolve('config/robots.txt'),
|
||||||
|
resolve('assets/favicon.svg'),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
for (const cacheFile of cacheFiles) {
|
for (const cacheFile of cacheFiles) {
|
||||||
@ -180,7 +165,7 @@ async function webpackConfig() {
|
|||||||
|
|
||||||
let cachedVersion = undefined;
|
let cachedVersion = undefined;
|
||||||
|
|
||||||
const versionFile = resolve('.well-known-cache', `${cacheDigest}.version`);
|
const versionFile = resolve(wellKnownCacheDir, `${cacheDigest}.version`);
|
||||||
try {
|
try {
|
||||||
if (fs.existsSync(versionFile)) {
|
if (fs.existsSync(versionFile)) {
|
||||||
cachedVersion = fs.readFileSync(versionFile, 'utf8');
|
cachedVersion = fs.readFileSync(versionFile, 'utf8');
|
||||||
@ -192,32 +177,24 @@ async function webpackConfig() {
|
|||||||
const versionDigest = cacheHash.digest('hex');
|
const versionDigest = cacheHash.digest('hex');
|
||||||
|
|
||||||
return Array.from(langs).map(lang => {
|
return Array.from(langs).map(lang => {
|
||||||
const tmpobj = tmp.fileSync({ postfix: ".json" });
|
|
||||||
fs.writeSync(tmpobj.fd, JSON.stringify(faviconConfig));
|
|
||||||
fs.close(tmpobj.fd);
|
|
||||||
|
|
||||||
return [
|
return [
|
||||||
new CopyPlugin({
|
new CopyPlugin({
|
||||||
patterns: [
|
patterns: [
|
||||||
{ from: 'config/robots.txt', to: resolve('well-known', lang, 'robots.txt') },
|
{ from: 'config/robots.txt', to: resolve(wellKnownDir, lang, 'robots.txt') },
|
||||||
|
{ from: `${faviconsDir}/include.html`, to: resolve(wellKnownDir, lang, 'html_code.html') },
|
||||||
|
{ from: `${faviconsDir}/*.png`, to: resolve(wellKnownDir, lang, '[name][ext]') },
|
||||||
]
|
]
|
||||||
}),
|
}),
|
||||||
{ apply: compiler => compiler.hooks.afterEmit.tap('AfterEmitPlugin', compilation => {
|
|
||||||
const imgFiles = globSync(resolve('well-known', lang) + '/*.@(png)');
|
|
||||||
const imgFilesArgs = Array.from(imgFiles).join(" ");
|
|
||||||
execSync(`exiftool -overwrite_original -all= ${imgFilesArgs}`, { stdio: 'inherit' });
|
|
||||||
})
|
|
||||||
}
|
|
||||||
];
|
];
|
||||||
}).flat(1);
|
}).flat(1);
|
||||||
})() */
|
})()
|
||||||
],
|
],
|
||||||
|
|
||||||
output: {
|
output: {
|
||||||
chunkFilename: '[chunkhash].js',
|
chunkFilename: '[chunkhash].js',
|
||||||
filename: '[chunkhash].js',
|
filename: '[chunkhash].js',
|
||||||
path: resolve('static', `wp-${webpackVersion}`),
|
path: resolve(staticDir, `wp-${webpackVersion}`),
|
||||||
publicPath: `/static/res/wp-${webpackVersion}/`,
|
publicPath: `/${staticDir}/res/wp-${webpackVersion}/`,
|
||||||
hashFunction: 'shake256',
|
hashFunction: 'shake256',
|
||||||
hashDigestLength: 36
|
hashDigestLength: 36
|
||||||
},
|
},
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user