diff --git a/.changeset/fifty-comics-cross.md b/.changeset/fifty-comics-cross.md new file mode 100644 index 000000000..6641dea15 --- /dev/null +++ b/.changeset/fifty-comics-cross.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fix cases of head propagation not occuring in dev server diff --git a/packages/astro/src/vite-plugin-head/index.ts b/packages/astro/src/vite-plugin-head/index.ts index f8a13f925..f89049c5e 100644 --- a/packages/astro/src/vite-plugin-head/index.ts +++ b/packages/astro/src/vite-plugin-head/index.ts @@ -45,19 +45,46 @@ export default function configHeadVitePlugin(): vite.Plugin { return { name: 'astro:head-metadata', + enforce: 'pre', + apply: 'serve', configureServer(_server) { server = _server; }, + resolveId(source, importer) { + if(importer) { + // Do propagation any time a new module is imported. This is because + // A module with propagation might be loaded before one of its parent pages + // is loaded, in which case that parent page won't have the in-tree and containsHead + // values. Walking up the tree in resolveId ensures that they do + return this.resolve(source, importer, { skipSelf: true }).then(result => { + if(result) { + let info = this.getModuleInfo(result.id); + const astro = info && getAstroMetadata(info); + if(astro) { + if(astro.propagation === 'self' || astro.propagation === 'in-tree') { + propagateMetadata.call(this, importer, 'propagation', 'in-tree'); + } + if(astro.containsHead) { + propagateMetadata.call(this, importer, 'containsHead', true); + } + } + } + return result; + }); + } + }, transform(source, id) { if (!server) { return; } + // TODO This could probably be removed now that this is handled in resolveId let info = this.getModuleInfo(id); if (info && getAstroMetadata(info)?.containsHead) { propagateMetadata.call(this, id, 'containsHead', true); } + // TODO This could probably be removed now that this is handled in resolveId if (info && getAstroMetadata(info)?.propagation === 'self') { const mod = server.moduleGraph.getModuleById(id); for (const parent of mod?.importers ?? []) { diff --git a/packages/astro/test/fixtures/view-transitions/package.json b/packages/astro/test/fixtures/view-transitions/package.json new file mode 100644 index 000000000..bc6790df4 --- /dev/null +++ b/packages/astro/test/fixtures/view-transitions/package.json @@ -0,0 +1,8 @@ +{ + "name": "@test/view-transitions", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*" + } +} diff --git a/packages/astro/test/fixtures/view-transitions/src/components/Animate.astro b/packages/astro/test/fixtures/view-transitions/src/components/Animate.astro new file mode 100644 index 000000000..251e44176 --- /dev/null +++ b/packages/astro/test/fixtures/view-transitions/src/components/Animate.astro @@ -0,0 +1 @@ +
diff --git a/packages/astro/test/fixtures/view-transitions/src/components/AnimateContainer.astro b/packages/astro/test/fixtures/view-transitions/src/components/AnimateContainer.astro new file mode 100644 index 000000000..d0ea817d5 --- /dev/null +++ b/packages/astro/test/fixtures/view-transitions/src/components/AnimateContainer.astro @@ -0,0 +1 @@ +