30 lines
1.4 KiB
JavaScript
30 lines
1.4 KiB
JavaScript
const { test } = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
const { readFileSync, existsSync } = require('node:fs');
|
|
const { join } = require('node:path');
|
|
|
|
const root = join(__dirname, '..');
|
|
const html = readFileSync(join(__dirname, 'index.html'), 'utf8');
|
|
const sw = readFileSync(join(__dirname, 'sw.js'), 'utf8');
|
|
const shellMatch = sw.match(/const SHELL = \[([\s\S]*?)\n\];/);
|
|
assert.ok(shellMatch, 'service worker SHELL list is present');
|
|
const shell = [...shellMatch[1].matchAll(/['"](\/[^'"]+)['"]/g)].map((match) => match[1]);
|
|
const listed = new Set(shell);
|
|
|
|
test('every local script and stylesheet in index.html is precached by the service worker', () => {
|
|
const localAssets = [];
|
|
for (const match of html.matchAll(/<(?:script\b[^>]*\bsrc|link\b[^>]*\bhref)="([^"]+)"/gi)) {
|
|
const url = match[1];
|
|
if (/^(?:[a-z]+:|\/|#)/i.test(url)) continue;
|
|
if (!/\.(?:js|css)(?:[?#]|$)/i.test(url)) continue;
|
|
localAssets.push(`/${url.split(/[?#]/, 1)[0]}`);
|
|
}
|
|
assert.ok(localAssets.length > 0, 'found local script/style assets');
|
|
for (const asset of localAssets) assert.ok(listed.has(asset), `${asset} appears in SHELL`);
|
|
});
|
|
|
|
test('every SHELL asset exists on disk and there are no duplicate entries', () => {
|
|
assert.equal(new Set(shell).size, shell.length, 'SHELL has no duplicate entries');
|
|
for (const asset of shell) assert.ok(existsSync(join(__dirname, asset.slice(1))), `${asset} exists`);
|
|
});
|