diff --git a/.changeset/small-wombats-know.md b/.changeset/small-wombats-know.md new file mode 100644 index 000000000000..ca826a1aab4b --- /dev/null +++ b/.changeset/small-wombats-know.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +fix miss a head when the templaterender has a promise diff --git a/packages/astro/src/runtime/server/render/astro/instance.ts b/packages/astro/src/runtime/server/render/astro/instance.ts index ed5044575ae5..abfcd94e89eb 100644 --- a/packages/astro/src/runtime/server/render/astro/instance.ts +++ b/packages/astro/src/runtime/server/render/astro/instance.ts @@ -50,6 +50,9 @@ export class AstroComponentInstance { value = await value; } if (isHeadAndContent(value)) { + if (this.result.extraHead.length === 0 && value.head) { + yield renderChild(value.head); + } yield* value.content; } else { yield* renderChild(value); diff --git a/packages/integrations/mdx/test/astro-content-css.test.js b/packages/integrations/mdx/test/astro-content-css.test.js new file mode 100644 index 000000000000..7168795cdeb7 --- /dev/null +++ b/packages/integrations/mdx/test/astro-content-css.test.js @@ -0,0 +1,46 @@ +import { expect } from 'chai'; +import * as cheerio from 'cheerio'; +import { loadFixture } from '../../../astro/test/test-utils.js'; +import mdx from '@astrojs/mdx'; + +describe('build css from the component', async () => { + let fixture; + + before(async () => { + fixture = await loadFixture({ root: new URL('./fixtures/astro-content-css/', import.meta.url),integrations: [mdx()], }); + await fixture.build(); + }); + + describe('Build', () => { + before(async () => { + await fixture.build(); + }); + + it('including css and js from the component in pro', async () => { + const html = await fixture.readFile('/index.html'); + const $ = cheerio.load(html); + expect($('link[href$=".css"]').attr('href')).to.match(/^\/_astro\//); + expect($('script[src$=".js"]').attr('src')).to.match(/^\/_astro\//); + }); + }) + + describe('Dev', () => { + let devServer + before(async () => { + devServer = await fixture.startDevServer(); + }); + + after(async () => { + devServer.stop(); + }); + + it('ncluding css and js from the component in Dev', async () => { + let res = await fixture.fetch(`/`); + expect(res.status).to.equal(200); + const html = await res.text(); + const $ = cheerio.load(html); + expect($.html()).to.include('CornflowerBlue'); + expect($('script[src$=".js"]').attr('src')).to.include('astro'); + }); + }) +}) diff --git a/packages/integrations/mdx/test/fixtures/astro-content-css/astro.config.mjs b/packages/integrations/mdx/test/fixtures/astro-content-css/astro.config.mjs new file mode 100644 index 000000000000..b67da09a917e --- /dev/null +++ b/packages/integrations/mdx/test/fixtures/astro-content-css/astro.config.mjs @@ -0,0 +1,11 @@ +import { defineConfig } from 'astro/config'; + +import mdx from "@astrojs/mdx"; + +// https://astro.build/config +export default defineConfig({ + build: { + format: 'file' + }, + integrations: [mdx()] +}); diff --git a/packages/integrations/mdx/test/fixtures/astro-content-css/package.json b/packages/integrations/mdx/test/fixtures/astro-content-css/package.json new file mode 100644 index 000000000000..8d436998c640 --- /dev/null +++ b/packages/integrations/mdx/test/fixtures/astro-content-css/package.json @@ -0,0 +1,9 @@ +{ + "name": "@test/astro-content-css", + "version": "0.0.0", + "private": true, + "dependencies": { + "astro": "workspace:*", + "@astrojs/mdx": "workspace:*" + } +} diff --git a/packages/integrations/mdx/test/fixtures/astro-content-css/src/content/config.ts b/packages/integrations/mdx/test/fixtures/astro-content-css/src/content/config.ts new file mode 100644 index 000000000000..bf1a34c0528f --- /dev/null +++ b/packages/integrations/mdx/test/fixtures/astro-content-css/src/content/config.ts @@ -0,0 +1,12 @@ +// 1. Import utilities from `astro:content` +import { z, defineCollection } from 'astro:content'; +// 2. Define a schema for each collection you'd like to validate. +const dynamicCollection = defineCollection({ + schema: z.object({ + title: z.string(), + }), +}); +// 3. Export a single `collections` object to register your collection(s) +export const collections = { + dynamic: dynamicCollection, +}; diff --git a/packages/integrations/mdx/test/fixtures/astro-content-css/src/content/dynamic/FirstComponentWithJS.astro b/packages/integrations/mdx/test/fixtures/astro-content-css/src/content/dynamic/FirstComponentWithJS.astro new file mode 100644 index 000000000000..f3b588b42713 --- /dev/null +++ b/packages/integrations/mdx/test/fixtures/astro-content-css/src/content/dynamic/FirstComponentWithJS.astro @@ -0,0 +1,18 @@ +--- +const { text } = Astro.props; +--- + + + + +
1st components with js. Props: {text}. Styles. JS:
+ + + + \ No newline at end of file diff --git a/packages/integrations/mdx/test/fixtures/astro-content-css/src/content/dynamic/first-component-with-js.mdx b/packages/integrations/mdx/test/fixtures/astro-content-css/src/content/dynamic/first-component-with-js.mdx new file mode 100644 index 000000000000..0abdfbe3a4f8 --- /dev/null +++ b/packages/integrations/mdx/test/fixtures/astro-content-css/src/content/dynamic/first-component-with-js.mdx @@ -0,0 +1,9 @@ +--- +title: 'First component' +--- + +import FirstDynamicComponentWithJS from './FirstComponentWithJS.astro'; + + + +Additional text from mdx 'first-component-with-js' diff --git a/packages/integrations/mdx/test/fixtures/astro-content-css/src/pages/index.astro b/packages/integrations/mdx/test/fixtures/astro-content-css/src/pages/index.astro new file mode 100644 index 000000000000..63ea9ddbb41b --- /dev/null +++ b/packages/integrations/mdx/test/fixtures/astro-content-css/src/pages/index.astro @@ -0,0 +1,16 @@ +--- +import { getCollection } from 'astro:content'; + +const entries = await getCollection('dynamic'); +--- + + + + + + {entries.map(async entry => { + const { Content } = await entry.render(); + return ; + })} + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 635c51a2f190..54421c429356 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4244,6 +4244,15 @@ importers: specifier: ^4.3.1 version: 4.3.1(@types/node@18.16.3)(sass@1.52.2) + packages/integrations/mdx/test/fixtures/astro-content-css: + dependencies: + '@astrojs/mdx': + specifier: workspace:* + version: link:../../.. + astro: + specifier: workspace:* + version: link:../../../../../astro + packages/integrations/mdx/test/fixtures/css-head-mdx: dependencies: '@astrojs/mdx':