Files
mastodon/config/vite/plugin-sw-chunk-paths.ts
jcoffey-dev 319ed76dbd
Crowdin / Upload translations / upload-translations (push) Skipped
Historical data migration test / test (14-alpine) (push) Canceled after 0s
Historical data migration test / test (15-alpine) (push) Canceled after 0s
Historical data migration test / test (16-alpine) (push) Canceled after 0s
Historical data migration test / test (17-alpine) (push) Canceled after 0s
Bundler Audit / security (push) Canceled after 0s
Haml Linting / lint (push) Canceled after 0s
JavaScript Linting / lint (push) Canceled after 0s
Ruby Linting / lint (push) Canceled after 0s
JavaScript Testing / test (push) Canceled after 0s
Ruby Testing / build (production) (push) Canceled after 0s
Ruby Testing / test (.ruby-version) (push) Canceled after 0s
Ruby Testing / test (3.3) (push) Canceled after 0s
Ruby Testing / test (3.4) (push) Canceled after 0s
Ruby Testing / End to End testing (.ruby-version) (push) Canceled after 0s
Ruby Testing / End to End testing (3.3) (push) Canceled after 0s
Ruby Testing / End to End testing (3.4) (push) Canceled after 0s
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:7.17.29) (push) Canceled after 0s
Check i18n / check-i18n (push) Canceled after 0s
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (javascript) (push) Canceled after 0s
CodeQL / Analyze (ruby) (push) Canceled after 0s
Ruby Testing / Elastic Search integration testing (.ruby-version, opensearchproject/opensearch:2) (push) Canceled after 0s
Ruby Testing / Elastic Search integration testing (3.3, docker.elastic.co/elasticsearch/elasticsearch:7.17.29) (push) Canceled after 0s
Ruby Testing / Elastic Search integration testing (3.4, docker.elastic.co/elasticsearch/elasticsearch:7.17.29) (push) Canceled after 0s
Check formatting / lint (push) Canceled after 0s
CSS Linting / lint (push) Canceled after 0s
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:8.19.2) (push) Canceled after 0s
Chromatic / Check for relevant changes (push) Canceled after 0s
Chromatic / Run Chromatic (push) Canceled after 0s
Import Mastodon v4.7.3
Snapshot of upstream tag v4.7.3 (commit 8ff11c2bb7b9f0714e947b10fa3629c6542c7121) from
https://github.com/mastodon/mastodon, unmodified.
2026-10-05 22:03:13 -07:00

62 lines
2.4 KiB
TypeScript

/* The service worker is built as a regular Vite entry point and is served from
`/sw.js` (a symlink to `packs/sw.js`), while the chunks it depends on live in
the build output directory (e.g. `/packs/`).
Browsers resolve a module's static import specifiers relative to the *URL* of
the script, not its location on disk. Because the worker is served from the
root, relative specifiers such as `./chunk-abc123.js` resolve to
`/chunk-abc123.js` and return a 404, which prevents the service worker from
installing.
This plugin rewrites those relative specifiers in the service worker output
to absolute paths pointing at the build output directory, so they resolve
correctly regardless of the URL the worker is served from.
*/
import type { Plugin, ResolvedConfig } from 'vite';
const SERVICE_WORKER_FILENAME = 'sw.js';
export function MastodonServiceWorkerChunkPaths(): Plugin {
let config: ResolvedConfig;
return {
name: 'mastodon-sw-chunk-paths',
configResolved(resolvedConfig) {
config = resolvedConfig;
},
renderChunk(code, chunk) {
if (chunk.fileName !== SERVICE_WORKER_FILENAME) {
return null;
}
// Resolve the base from the final Vite config rather than receiving it as
// an argument, so forks or other plugins that alter `base` are respected.
// Vite normalises `base` to always include a trailing slash.
const { base } = config;
// Drive the rewrite from the chunk's actual dependency list rather than a
// generic regex, so we only ever touch real (hashed) chunk specifiers and
// never accidentally match similar-looking text inside string literals.
const dependencies = [...chunk.imports, ...chunk.dynamicImports];
let rewritten = code;
for (const dependency of dependencies) {
// The worker sits at the root of the output directory, so each
// dependency is imported with a leading `./`.
rewritten = rewritten
.replaceAll(`"./${dependency}"`, `"${base}${dependency}"`)
.replaceAll(`'./${dependency}'`, `'${base}${dependency}'`);
}
if (rewritten === code) {
return null;
}
// Only import specifiers are changed, so the existing source map stays
// accurate enough; returning `null` avoids a spurious sourcemap warning.
return { code: rewritten, map: null };
},
};
}