replace global hash in given chunks

This commit is contained in:
Bruno Windels 2021-12-09 12:15:17 +01:00
parent c344032c0a
commit 8e4da396ea
4 changed files with 24 additions and 6 deletions

View file

@ -15,6 +15,7 @@ module.exports = {
"no-unused-vars": "warn" "no-unused-vars": "warn"
}, },
"globals": { "globals": {
"HYDROGEN_VERSION": "readonly" "HYDROGEN_VERSION": "readonly",
"HYDROGEN_GLOBAL_HASH": "readonly"
} }
}; };

View file

@ -8,7 +8,7 @@ function contentHash(str) {
return hasher.digest(); return hasher.digest();
} }
module.exports = function injectServiceWorker(swFile, otherUncachedFiles) { module.exports = function injectServiceWorker(swFile, otherUncachedFiles, globalHashChunkReplaceMap) {
const swName = path.basename(swFile); const swName = path.basename(swFile);
let root; let root;
let version; let version;
@ -43,6 +43,7 @@ module.exports = function injectServiceWorker(swFile, otherUncachedFiles) {
const globalHash = getBuildHash(cachedFileNames, uncachedFileContentMap); const globalHash = getBuildHash(cachedFileNames, uncachedFileContentMap);
const sw = bundle[swName]; const sw = bundle[swName];
sw.code = replaceConstsInServiceWorker(sw.code, version, globalHash, assets); sw.code = replaceConstsInServiceWorker(sw.code, version, globalHash, assets);
replaceGlobalHashPlaceholderInChunks(assets, globalHashChunkReplaceMap, globalHash);
console.log(`\nBuilt ${version} (${globalHash})`); console.log(`\nBuilt ${version} (${globalHash})`);
} }
}; };
@ -115,3 +116,14 @@ function replaceConstsInServiceWorker(swSource, version, globalHash, assets) {
swSource = replaceStringInSource("NOTIFICATION_BADGE_ICON", assets.find(a => a.name === "icon.png").fileName); swSource = replaceStringInSource("NOTIFICATION_BADGE_ICON", assets.find(a => a.name === "icon.png").fileName);
return swSource; return swSource;
} }
function replaceGlobalHashPlaceholderInChunks(assets, globalHashChunkReplaceMap, globalHash) {
for (const [name, placeholder] of Object.entries(globalHashChunkReplaceMap)) {
const chunk = assets.find(a => a.type === "chunk" && a.name === name);
if (!chunk) {
throw new Error(`could not find chunk ${name} to replace global hash placeholder`);
}
console.log(placeholder, globalHash);
chunk.code = chunk.code.replaceAll(placeholder, `"${globalHash}"`);
}
}

View file

@ -15,10 +15,10 @@ limitations under the License.
*/ */
export function hydrogenGithubLink(t) { export function hydrogenGithubLink(t) {
if (HYDROGEN_VERSION) { if (HYDROGEN_VERSION && HYDROGEN_GLOBAL_HASH) {
return t.a({target: "_blank", return t.a({target: "_blank",
href: `https://github.com/vector-im/hydrogen-web/releases/tag/v${HYDROGEN_VERSION}`}, href: `https://github.com/vector-im/hydrogen-web/releases/tag/v${HYDROGEN_VERSION}`},
`Hydrogen v${HYDROGEN_VERSION} (${window.HYDROGEN_GLOBAL_HASH}) on Github`); `Hydrogen v${HYDROGEN_VERSION} (${HYDROGEN_GLOBAL_HASH}) on Github`);
} else { } else {
return t.a({target: "_blank", href: "https://github.com/vector-im/hydrogen-web"}, return t.a({target: "_blank", href: "https://github.com/vector-im/hydrogen-web"},
"Hydrogen on Github"); "Hydrogen on Github");

View file

@ -4,6 +4,7 @@ const flexbugsFixes = require("postcss-flexbugs-fixes");
const fs = require("fs"); const fs = require("fs");
const path = require("path"); const path = require("path");
const GLOBAL_HASH_PLACEHOLDER = "hydrogen-global-hash-placeholder-4cf32306-5d61-4262-9a57-c9983f472c3c";
const injectWebManifest = require("./scripts/build-plugins/manifest"); const injectWebManifest = require("./scripts/build-plugins/manifest");
const injectServiceWorker = require("./scripts/build-plugins/service-worker"); const injectServiceWorker = require("./scripts/build-plugins/service-worker");
@ -50,10 +51,14 @@ export default {
// important this comes before service worker // important this comes before service worker
// otherwise the manifest and the icons it refers to won't be cached // otherwise the manifest and the icons it refers to won't be cached
injectWebManifest("assets/manifest.json"), injectWebManifest("assets/manifest.json"),
injectServiceWorker("./src/platform/web/sw.js", ["index.html"]), injectServiceWorker("./src/platform/web/sw.js", ["index.html"], {
// replace global hash placeholder in index chunk
"index": JSON.stringify(GLOBAL_HASH_PLACEHOLDER)
}),
], ],
define: { define: {
"HYDROGEN_VERSION": JSON.stringify(version) "HYDROGEN_VERSION": JSON.stringify(version),
"HYDROGEN_GLOBAL_HASH": JSON.stringify(GLOBAL_HASH_PLACEHOLDER)
}, },
css: { css: {
postcss: { postcss: {