mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-27 21:55:24 +00:00
* fix(sw): stamp __TERMIX_SW_BASE_PATH__ and version into sw.js at build time vite copies public/ verbatim, so the placeholder in public/sw.js reached dist/sw.js untouched. The service worker then requested __TERMIX_SW_BASE_PATH__/favicon.ico and friends, its install promise rejected, and it never activated - while a worker from an older release kept serving its cached frontend against a newer backend. scripts/stamp-sw-build-info.cjs now runs right after vite build and replaces both placeholders in dist/sw.js: - __TERMIX_SW_BASE_PATH__ -> the base path the build used (VITE_BASE_PATH, or root-relative by default, matching vite.config.ts) - __TERMIX_CACHE_VERSION__ -> package.json version, so CACHE_NAME changes per release and the activate handler evicts the previous build's cache Closes #1617 * chore: format stamp-sw-build-info.cjs to prettier style * fix: preserve runtime service worker base paths --------- Co-authored-by: inontz <inontz@users.noreply.github.com> Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
60 lines
1.7 KiB
TypeScript
60 lines
1.7 KiB
TypeScript
import { execFileSync } from "node:child_process";
|
|
import {
|
|
mkdtempSync,
|
|
mkdirSync,
|
|
readFileSync,
|
|
writeFileSync,
|
|
rmSync,
|
|
} from "node:fs";
|
|
import { tmpdir } from "node:os";
|
|
import path from "node:path";
|
|
import { expect, it } from "vitest";
|
|
|
|
it.each([
|
|
[false, "", ""],
|
|
[false, "/termix/", "/termix"],
|
|
[true, "", "__TERMIX_SW_BASE_PATH__"],
|
|
])(
|
|
"stamps service worker paths (runtime=%s, base=%s)",
|
|
(runtime, base, expected) => {
|
|
const dir = mkdtempSync(path.join(tmpdir(), "termix-sw-"));
|
|
try {
|
|
mkdirSync(path.join(dir, "scripts"));
|
|
mkdirSync(path.join(dir, "dist"));
|
|
writeFileSync(
|
|
path.join(dir, "scripts/stamp-sw-build-info.cjs"),
|
|
readFileSync("scripts/stamp-sw-build-info.cjs"),
|
|
);
|
|
writeFileSync(
|
|
path.join(dir, "package.json"),
|
|
JSON.stringify({ version: "26.10.2" }),
|
|
);
|
|
writeFileSync(path.join(dir, "dist/sw.js"), readFileSync("public/sw.js"));
|
|
execFileSync(
|
|
process.execPath,
|
|
[path.join(dir, "scripts/stamp-sw-build-info.cjs")],
|
|
{
|
|
env: {
|
|
...process.env,
|
|
VITE_BASE_PATH: base,
|
|
TERMIX_RUNTIME_BASE_PATH: String(runtime),
|
|
},
|
|
},
|
|
);
|
|
const sw = readFileSync(path.join(dir, "dist/sw.js"), "utf8");
|
|
expect(sw).toContain('"26-10-2"');
|
|
expect(sw).toContain(`const BASE_PATH = "${expected}";`);
|
|
if (runtime) {
|
|
expect(sw.replaceAll("__TERMIX_SW_BASE_PATH__", "/termix")).toContain(
|
|
'const BASE_PATH = "/termix";',
|
|
);
|
|
expect(readFileSync("docker/Dockerfile", "utf8")).toContain(
|
|
"TERMIX_RUNTIME_BASE_PATH=true",
|
|
);
|
|
}
|
|
} finally {
|
|
rmSync(dir, { recursive: true, force: true });
|
|
}
|
|
},
|
|
);
|