mirror of
https://github.com/vector-im/hydrogen-web.git
synced 2024-11-20 11:36:24 +01:00
52 lines
1.9 KiB
JavaScript
52 lines
1.9 KiB
JavaScript
const fs = require('fs/promises');
|
|
const path = require('path');
|
|
|
|
module.exports = function injectWebManifest(manifestFile) {
|
|
let root;
|
|
let base;
|
|
let manifestHref;
|
|
return {
|
|
name: "hydrogen:injectWebManifest",
|
|
apply: "build",
|
|
configResolved: config => {
|
|
root = config.root;
|
|
base = config.base;
|
|
},
|
|
transformIndexHtml: {
|
|
transform(html) {
|
|
return [{
|
|
tag: "link",
|
|
attrs: {rel: "manifest", href: manifestHref},
|
|
injectTo: "head"
|
|
}];
|
|
},
|
|
},
|
|
generateBundle: async function() {
|
|
const absoluteManifestFile = path.resolve(root, manifestFile);
|
|
const manifestDir = path.dirname(absoluteManifestFile);
|
|
const json = await fs.readFile(absoluteManifestFile, {encoding: "utf8"});
|
|
const manifest = JSON.parse(json);
|
|
for (const icon of manifest.icons) {
|
|
const iconFileName = path.resolve(manifestDir, icon.src);
|
|
const imgData = await fs.readFile(iconFileName);
|
|
const ref = this.emitFile({
|
|
type: "asset",
|
|
name: path.basename(iconFileName),
|
|
source: imgData
|
|
});
|
|
// we take the basename as getFileName gives the filename
|
|
// relative to the output dir, but the manifest is an asset
|
|
// just like they icon, so we assume they end up in the same dir
|
|
icon.src = path.basename(this.getFileName(ref));
|
|
}
|
|
const outputName = path.basename(absoluteManifestFile);
|
|
const manifestRef = this.emitFile({
|
|
type: "asset",
|
|
name: outputName,
|
|
source: JSON.stringify(manifest)
|
|
});
|
|
manifestHref = base + this.getFileName(manifestRef);
|
|
}
|
|
};
|
|
}
|