From 69fbf95b22c0fb0d8e7e5fef9ec61e26cac9767f Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Mon, 25 Sep 2023 22:14:37 +0800 Subject: [PATCH] Head propagation graph walking on new pages (#8646) * Head propagation graph walking on new pages * Add changeset * Avoid the bang * Add TODOs about handling in resolveId --- .changeset/fifty-comics-cross.md | 5 ++++ packages/astro/src/vite-plugin-head/index.ts | 27 +++++++++++++++++++ .../fixtures/view-transitions/package.json | 8 ++++++ .../src/components/Animate.astro | 1 + .../src/components/AnimateContainer.astro | 1 + .../src/components/Animations.astro | 4 +++ .../view-transitions/src/pages/one.astro | 11 ++++++++ .../view-transitions/src/pages/two.astro | 15 +++++++++++ pnpm-lock.yaml | 6 +++++ 9 files changed, 78 insertions(+) create mode 100644 .changeset/fifty-comics-cross.md create mode 100644 packages/astro/test/fixtures/view-transitions/package.json create mode 100644 packages/astro/test/fixtures/view-transitions/src/components/Animate.astro create mode 100644 packages/astro/test/fixtures/view-transitions/src/components/AnimateContainer.astro create mode 100644 packages/astro/test/fixtures/view-transitions/src/components/Animations.astro create mode 100644 packages/astro/test/fixtures/view-transitions/src/pages/one.astro create mode 100644 packages/astro/test/fixtures/view-transitions/src/pages/two.astro diff --git a/.changeset/fifty-comics-cross.md b/.changeset/fifty-comics-cross.md new file mode 100644 index 0000000000..6641dea15b --- /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 f8a13f925d..f89049c5e4 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 0000000000..bc6790df43 --- /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 0000000000..251e441763 --- /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 0000000000..d0ea817d54
--- /dev/null
+++ b/packages/astro/test/fixtures/view-transitions/src/components/AnimateContainer.astro
@@ -0,0 +1 @@
+
diff --git a/packages/astro/test/fixtures/view-transitions/src/components/Animations.astro b/packages/astro/test/fixtures/view-transitions/src/components/Animations.astro
new file mode 100644
index 0000000000..6c4a8733ef
--- /dev/null
+++ b/packages/astro/test/fixtures/view-transitions/src/components/Animations.astro
@@ -0,0 +1,4 @@
+---
+import Animate from './Animate.astro';
+---
+
diff --git a/packages/astro/test/fixtures/view-transitions/src/pages/one.astro b/packages/astro/test/fixtures/view-transitions/src/pages/one.astro
new file mode 100644
index 0000000000..dbfaaadb8e
--- /dev/null
+++ b/packages/astro/test/fixtures/view-transitions/src/pages/one.astro
@@ -0,0 +1,11 @@
+---
+import Animate from '../components/Animate.astro';
+---
+
+
+	Testing
+
+
+	
+
+
diff --git a/packages/astro/test/fixtures/view-transitions/src/pages/two.astro b/packages/astro/test/fixtures/view-transitions/src/pages/two.astro
new file mode 100644
index 0000000000..dea8778309
--- /dev/null
+++ b/packages/astro/test/fixtures/view-transitions/src/pages/two.astro
@@ -0,0 +1,15 @@
+---
+
+import AnimateContainer from '../components/AnimateContainer.astro';
+import Animations from '../components/Animations.astro';
+---
+
+
+	Testing
+
+
+	
+		
+	
+
+
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2463f9ef1a..0216539d4f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -3512,6 +3512,12 @@ importers:
         specifier: workspace:*
         version: link:../../..
 
+  packages/astro/test/fixtures/view-transitions:
+    dependencies:
+      astro:
+        specifier: workspace:*
+        version: link:../../..
+
   packages/astro/test/fixtures/virtual-astro-file:
     dependencies:
       astro: