diff --git a/.changeset/brown-tires-melt.md b/.changeset/brown-tires-melt.md new file mode 100644 index 00000000..741b573c --- /dev/null +++ b/.changeset/brown-tires-melt.md @@ -0,0 +1,5 @@ +--- +"@astrojs/compiler": patch +--- + +Fixes an issue where `server:defer` was treated like a transition directive, causing ViewTransitions CSS to be included even when no `transition:*` directives were used. diff --git a/internal/transform/transform.go b/internal/transform/transform.go index af66dd5f..cd2d01db 100644 --- a/internal/transform/transform.go +++ b/internal/transform/transform.go @@ -51,11 +51,14 @@ func Transform(doc *astro.Node, opts TransformOptions, h *handler.Handler) *astr if shouldScope { ScopeElement(n, opts) } - if HasAttr(n, TRANSITION_ANIMATE) || HasAttr(n, TRANSITION_NAME) || HasAttr(n, TRANSITION_PERSIST) || HasAttr(n, SERVER_DEFER) { + if HasAttr(n, TRANSITION_ANIMATE) || HasAttr(n, TRANSITION_NAME) || HasAttr(n, TRANSITION_PERSIST) { doc.Transition = true doc.HeadPropagation = true getOrCreateTransitionScope(n, &opts, i) } + if HasAttr(n, SERVER_DEFER) { + doc.HeadPropagation = true + } if len(definedVars) > 0 { didAdd := AddDefineVars(n, definedVars) if !didAddDefinedVars { diff --git a/internal/transform/transform_test.go b/internal/transform/transform_test.go index 91885ec0..d4df3536 100644 --- a/internal/transform/transform_test.go +++ b/internal/transform/transform_test.go @@ -314,6 +314,54 @@ func TestFullTransform(t *testing.T) { } } +func TestTransformTransitionAndHeadPropagationFlags(t *testing.T) { + tests := []struct { + name string + source string + wantTransition bool + wantHeadPropagation bool + }{ + { + name: "server:defer only", + source: ``, + wantTransition: false, + wantHeadPropagation: true, + }, + { + name: "transition directive", + source: `
`, + wantTransition: true, + wantHeadPropagation: true, + }, + { + name: "transition:persist-props alone does not count as transition directive", + source: ``, + wantTransition: false, + wantHeadPropagation: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + doc, err := astro.Parse(strings.NewReader(tt.source)) + if err != nil { + t.Fatal(err) + } + + transformOptions := TransformOptions{} + ExtractStyles(doc, &transformOptions) + Transform(doc, transformOptions, handler.NewHandler(tt.source, "/test.astro")) + + if doc.Transition != tt.wantTransition { + t.Fatalf("unexpected doc.Transition value: want %v, got %v", tt.wantTransition, doc.Transition) + } + if doc.HeadPropagation != tt.wantHeadPropagation { + t.Fatalf("unexpected doc.HeadPropagation value: want %v, got %v", tt.wantHeadPropagation, doc.HeadPropagation) + } + }) + } +} + func TestTransformTrailingSpace(t *testing.T) { tests := []struct { name string