penguinmod-editor-2 / src /playground /generate-service-worker-plugin.js
soiz1's picture
Upload 2891 files
6bcb42f verified
/* eslint-disable import/no-commonjs */
const RawSource = require('webpack-sources').RawSource;
const crypto = require('crypto');
const PLUGIN_NAME = 'TWGenerateServiceWorkerPlugin';
const SW_NAME = 'sw.js';
const INCLUDE_HTML = [
'index.html',
'editor.html',
'playground.html',
'fullscreen.html',
'addons.html'
];
const hash = object => crypto.createHash('sha1')
.update(JSON.stringify(object))
.digest('hex');
class TWGenerateServiceWorkerPlugin {
apply (compiler) {
const allAssetNames = new Set();
compiler.hooks.emit.tap(PLUGIN_NAME, compilation => {
const newAssetNames = compilation.getAssets()
.map(i => i.name);
for (const name of newAssetNames) {
allAssetNames.add(name);
}
const htmlAssets = [];
const lazyAssets = [];
for (const name of allAssetNames) {
if (
// HTML
INCLUDE_HTML.includes(name)
) htmlAssets.push(name);
else if (
// scratch-blocks
name.startsWith('static/blocks-media') &&
// Only used in horizontal mode
!name.includes('event_broadcast_') &&
!name.includes('event_when-broadcast-received_') &&
!name.includes('event_whenflagclicked') &&
// Useless without internet connection
!name.includes('wedo_') &&
!name.includes('set-led_') &&
!name.includes('microbit-block-icon') &&
!name.includes('wedo2-block-icon')
) lazyAssets.push(name);
else if (
// other assets
name.startsWith('static/assets')
) lazyAssets.push(name);
else if (
// JavaScript
name.startsWith('js/') &&
name.endsWith('.js') &&
!name.includes('worker') &&
!name.startsWith('js/embed') &&
!name.startsWith('js/credits') &&
!name.startsWith('js/library-')
) lazyAssets.push(name);
}
const id = hash(allAssetNames);
const workerFile = compilation.getAsset(SW_NAME);
if (workerFile) {
const workerSource = workerFile.source.source().toString();
const newSource = workerSource
.replace('__HTML_ASSETS__', JSON.stringify(htmlAssets))
.replace('__LAZY_ASSETS__', JSON.stringify(lazyAssets))
.replace('__LAZY_ASSETS_NAME__', JSON.stringify(`tw-lazy-${id}`));
compilation.updateAsset(SW_NAME, new RawSource(newSource));
}
});
}
}
module.exports = TWGenerateServiceWorkerPlugin;