Use relative release manifest asset paths
This commit is contained in:
@@ -231,9 +231,9 @@ async function distStaticPaths() {
|
||||
workboxFile ? `/${workboxFile}` : "",
|
||||
releaseEntry.entry ? `/${releaseEntry.entry}` : "",
|
||||
...(releaseEntry.css || []).map((fileName: string) => `/${fileName}`),
|
||||
...(releaseManifest.index_asset_urls || []),
|
||||
...(releaseManifest.pwa_asset_urls || []),
|
||||
...(releaseManifest.asset_urls || []),
|
||||
...(releaseManifest.index_asset_urls || []).map(releaseRootStaticPath),
|
||||
...(releaseManifest.pwa_asset_urls || []).map(releaseRootStaticPath),
|
||||
...(releaseManifest.asset_urls || []).map(releaseRootStaticPath),
|
||||
cssFile || "",
|
||||
].filter(Boolean)
|
||||
)
|
||||
@@ -304,6 +304,7 @@ test.describe("public .htaccess static fallback", () => {
|
||||
|
||||
test("emits favicon and manifest links from generated assets", async () => {
|
||||
const indexHtml = await fs.readFile(path.join(DIST_DIR, "index.html"), "utf8");
|
||||
const releaseManifest = JSON.parse(await fs.readFile(path.join(DIST_DIR, "release-manifest.json"), "utf8"));
|
||||
const legacyManifest = JSON.parse(await fs.readFile(path.join(DIST_DIR, "manifest.json"), "utf8"));
|
||||
const rootWebManifest = JSON.parse(await fs.readFile(path.join(DIST_DIR, "manifest.webmanifest"), "utf8"));
|
||||
|
||||
@@ -327,6 +328,16 @@ test.describe("public .htaccess static fallback", () => {
|
||||
for (const icon of [...(legacyManifest.icons || []), ...(rootWebManifest.icons || [])]) {
|
||||
expect(icon.src).toMatch(/^(?:assets|\/master\/frontend\/assets)\/favicons\//);
|
||||
}
|
||||
|
||||
for (const assetPath of [
|
||||
releaseManifest.entry,
|
||||
...(releaseManifest.css || []),
|
||||
...(releaseManifest.index_asset_urls || []),
|
||||
...(releaseManifest.pwa_asset_urls || []),
|
||||
...(releaseManifest.asset_urls || []),
|
||||
].filter(Boolean)) {
|
||||
expect(assetPath, "release manifest asset paths must be base-relative").not.toMatch(/^\/(?!master\/frontend\/)/);
|
||||
}
|
||||
});
|
||||
|
||||
test("serves the app shell from root, deep links, and release-prefixed paths", async ({ request }) => {
|
||||
|
||||
@@ -128,7 +128,7 @@ test("@public-live release manifest, shell, and static assets are available", as
|
||||
|
||||
for (const assetPath of assetPaths) {
|
||||
const hashKey = assetPath.startsWith("/") ? assetPath : `/${assetPath}`;
|
||||
await expectStaticAsset(request, assetPath, manifest.asset_hashes?.[hashKey]);
|
||||
await expectStaticAsset(request, assetPath, manifest.asset_hashes?.[assetPath] || manifest.asset_hashes?.[hashKey]);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
+13
-8
@@ -86,6 +86,10 @@ function releaseManifestPath(pathname) {
|
||||
return normalizedPathname
|
||||
}
|
||||
|
||||
function releaseManifestAssetPath(value) {
|
||||
return String(value || '').replace(/^\/+/, '')
|
||||
}
|
||||
|
||||
function getGitCommit() {
|
||||
const envCommit = firstReleaseCommitEnv()
|
||||
if (envCommit) {
|
||||
@@ -200,7 +204,7 @@ function releaseDistAssetUrls(outputDirectory) {
|
||||
continue
|
||||
}
|
||||
|
||||
assetUrls.push(`/${relativePath}`)
|
||||
assetUrls.push(relativePath)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -228,7 +232,7 @@ function patchBuefyCssMediaQuery() {
|
||||
nextCode = nextCode.replaceAll(invalidSnippet, fixedSnippet)
|
||||
didPatch = true
|
||||
}
|
||||
|
||||
|
||||
if (!didPatch) {
|
||||
return null
|
||||
}
|
||||
@@ -356,10 +360,11 @@ function releaseMetadataManifest() {
|
||||
const emittedAssetUrls = releaseDistAssetUrls(outputDirectory)
|
||||
const indexAssetUrls = Array.from(indexHtml.matchAll(/\b(?:href|src)=["']([^"']+)["']/g))
|
||||
.map((match) => releaseUrlPath(match[1], '/index.html'))
|
||||
.map(releaseManifestAssetPath)
|
||||
.filter(Boolean)
|
||||
const releaseEntryAssetUrls = [
|
||||
releaseEntry.entry ? `/${releaseEntry.entry}` : '',
|
||||
...(Array.isArray(releaseEntry.css) ? releaseEntry.css.map((fileName) => `/${fileName}`) : [])
|
||||
releaseEntry.entry ? releaseManifestAssetPath(releaseEntry.entry) : '',
|
||||
...(Array.isArray(releaseEntry.css) ? releaseEntry.css.map(releaseManifestAssetPath) : [])
|
||||
].filter(Boolean)
|
||||
const pwaAssetUrls = [
|
||||
'manifest.json',
|
||||
@@ -373,7 +378,7 @@ function releaseMetadataManifest() {
|
||||
...rootFiles.filter((fileName) => /^workbox-[^/]+\.js$/.test(fileName))
|
||||
]
|
||||
.filter((fileName) => fs.existsSync(path.join(outputDirectory, fileName)))
|
||||
.map((fileName) => `/${fileName.replace(/\\/g, '/')}`)
|
||||
.map((fileName) => releaseManifestAssetPath(fileName.replace(/\\/g, '/')))
|
||||
|
||||
for (const manifestPath of ['manifest.webmanifest', 'assets/manifest.webmanifest']) {
|
||||
const absoluteManifestPath = path.join(outputDirectory, manifestPath)
|
||||
@@ -386,7 +391,7 @@ function releaseMetadataManifest() {
|
||||
for (const icon of pwaManifest.icons || []) {
|
||||
const iconPath = releaseUrlPath(icon.src || '', `/${manifestPath}`)
|
||||
if (iconPath) {
|
||||
pwaAssetUrls.push(iconPath)
|
||||
pwaAssetUrls.push(releaseManifestAssetPath(iconPath))
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
@@ -395,8 +400,8 @@ function releaseMetadataManifest() {
|
||||
}
|
||||
|
||||
const criticalAssetUrls = Array.from(new Set([
|
||||
'/index.html',
|
||||
'/release-entry.json',
|
||||
'index.html',
|
||||
'release-entry.json',
|
||||
...emittedAssetUrls,
|
||||
...indexAssetUrls,
|
||||
...releaseEntryAssetUrls,
|
||||
|
||||
Reference in New Issue
Block a user