diff --git a/.changeset/mighty-trees-teach.md b/.changeset/mighty-trees-teach.md
new file mode 100644
index 000000000000..289a41816154
--- /dev/null
+++ b/.changeset/mighty-trees-teach.md
@@ -0,0 +1,5 @@
+---
+'@astrojs/mdx': patch
+---
+
+Fixes stack trace location when failed to parse an MDX file with frontmatter
diff --git a/.changeset/poor-frogs-dream.md b/.changeset/poor-frogs-dream.md
new file mode 100644
index 000000000000..fdb3daa85284
--- /dev/null
+++ b/.changeset/poor-frogs-dream.md
@@ -0,0 +1,7 @@
+---
+'astro': major
+---
+
+Refactor the exported types from the `astro` module. There should normally be no breaking changes, but if you relied on some previously deprecated types, these might now have been fully removed.
+
+In most cases, updating your code to move away from previously deprecated APIs in previous versions of Astro should be enough to fix any issues.
diff --git a/.changeset/pre.json b/.changeset/pre.json
index 8a327161067b..f239e523d5cc 100644
--- a/.changeset/pre.json
+++ b/.changeset/pre.json
@@ -1,6 +1,6 @@
{
"mode": "pre",
- "tag": "beta",
+ "tag": "alpha",
"initialVersions": {
"astro": "4.13.1",
"@astrojs/prism": "3.1.0",
diff --git a/.changeset/small-ties-sort.md b/.changeset/small-ties-sort.md
new file mode 100644
index 000000000000..e3f3d67eb4f8
--- /dev/null
+++ b/.changeset/small-ties-sort.md
@@ -0,0 +1,50 @@
+---
+'astro': major
+---
+
+Fixes attribute rendering for non-[boolean HTML attributes](https://developer.mozilla.org/en-US/docs/Glossary/Boolean/HTML) with boolean values to match proper attribute handling in browsers.
+
+Previously, non-boolean attributes may not have included their values when rendered to HTML. In Astro v5.0, the values are now explicitly rendered as `="true"` or `="false"`
+
+In the following `.astro` examples, only `allowfullscreen` is a boolean attribute:
+
+```astro
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+Astro v5.0 now preserves the full data attribute with its value when rendering the HTML of non-boolean attributes:
+
+```diff
+
+
+
+
+-
++
+
+-
++
+-
++
+```
+
+If you rely on attribute values, for example to locate elements or to conditionally render, update your code to match the new non-boolean attribute values:
+
+```diff
+- el.getAttribute('inherit') === ''
++ el.getAttribute('inherit') === 'false'
+
+- el.hasAttribute('data-light')
++ el.dataset.light === 'true'
+```
diff --git a/.changeset/spicy-houses-fry.md b/.changeset/spicy-houses-fry.md
new file mode 100644
index 000000000000..41f376a3546f
--- /dev/null
+++ b/.changeset/spicy-houses-fry.md
@@ -0,0 +1,5 @@
+---
+'astro': patch
+---
+
+Simplifies path operations of `astro sync`
diff --git a/.github/labeler.yml b/.github/labeler.yml
index c1025ad117d1..b0d27800ba97 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -40,5 +40,5 @@
- packages/integrations/vue/**
'docs pr':
-- packages/astro/src/@types/astro.ts
+- packages/astro/src/types/public/**
- packages/astro/src/core/errors/errors-data.ts
diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml
index c1b4919901ab..2ce9ac1dbd53 100644
--- a/.github/workflows/check.yml
+++ b/.github/workflows/check.yml
@@ -11,7 +11,7 @@ on:
- "examples/**"
- ".github/workflows/check.yml"
- "scripts/smoke/check.js"
- - "packages/astro/src/@types/astro.ts"
+ - "packages/astro/src/types/public/**"
- "pnpm-lock.yaml"
- "packages/astro/types.d.ts"
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 79962c07e1ce..d516ab47a93f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -229,7 +229,7 @@ jobs:
filters: |
docs:
- 'packages/integrations/*/README.md'
- - 'packages/astro/src/@types/astro.ts'
+ - "packages/astro/src/types/public/**"
- 'packages/astro/src/core/errors/errors-data.ts'
- name: Build autogenerated docs pages from current astro branch
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index caaa9e726e10..6a657068d1df 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -289,7 +289,7 @@ Server-side rendering (SSR) can be complicated. The Astro package (`packages/ast
- `components/`: Built-in components to use in your project (e.g. `import Code from 'astro/components/Code.astro'`)
- `src/`: Astro source
- - `@types/`: TypeScript types. These are centralized to cut down on circular dependencies
+ - `types/`: TypeScript types. These are centralized to cut down on circular dependencies
- `cli/`: Code that powers the `astro` CLI command
- `core/`: Code that executes **in the top-level scope** (in Node). Within, you’ll find code that powers the `astro build` and `astro dev` commands, as well as top-level SSR code.
- `runtime/`: Code that executes **in different scopes** (i.e. not in a pure Node context). You’ll have to think about code differently here.
diff --git a/README.md b/README.md
index 8cc1dd3780c6..62589bac80ce 100644
--- a/README.md
+++ b/README.md
@@ -69,7 +69,8 @@ Join us on [Discord](https://astro.build/chat) to meet other maintainers. We'll
| [@astrojs/alpinejs](packages/integrations/alpinejs) | [![@astrojs/alpinejs version](https://img.shields.io/npm/v/@astrojs/alpinejs.svg?label=%20)](packages/integrations/alpinejs/CHANGELOG.md) |
| [@astrojs/mdx](packages/integrations/mdx) | [![@astrojs/mdx version](https://img.shields.io/npm/v/@astrojs/mdx.svg?label=%20)](packages/integrations/mdx/CHANGELOG.md) |
| [@astrojs/db](packages/db) | [![@astrojs/db version](https://img.shields.io/npm/v/@astrojs/db.svg?label=%20)](packages/db/CHANGELOG.md) |
-| [@astrojs/rss](packages/integrations/astro-rss) | [![@astrojs/rss version](https://img.shields.io/npm/v/@astrojs/rss.svg?label=%20)](packages/astro-rss/CHANGELOG.md) |
+| [@astrojs/rss](packages/astro-rss) | [![@astrojs/rss version](https://img.shields.io/npm/v/@astrojs/rss.svg?label=%20)](packages/astro-rss/CHANGELOG.md) |
+| [@astrojs/netlify](https://github.com/withastro/adapters/blob/main/packages/netlify) | [![@astrojs/netlify version](https://img.shields.io/npm/v/@astrojs/netlify.svg?label=%20)](https://github.com/withastro/adapters/blob/main/packages/netlify/CHANGELOG.md) |
[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6178/badge)](https://bestpractices.coreinfrastructure.org/projects/6178)
diff --git a/benchmark/bench/memory.js b/benchmark/bench/memory.js
index 34a4972f78b1..3a437b3fe357 100644
--- a/benchmark/bench/memory.js
+++ b/benchmark/bench/memory.js
@@ -18,7 +18,7 @@ export async function run(projectDir, outputFile) {
const outputFilePath = fileURLToPath(outputFile);
console.log('Building and benchmarking...');
- await execaCommand(`node --expose-gc --max_old_space_size=256 ${astroBin} build`, {
+ await execaCommand(`node --expose-gc --max_old_space_size=10000 ${astroBin} build --silent`, {
cwd: root,
stdio: 'inherit',
env: {
diff --git a/benchmark/make-project/image.jpg b/benchmark/make-project/image.jpg
new file mode 100644
index 000000000000..80b8ea67b8e4
Binary files /dev/null and b/benchmark/make-project/image.jpg differ
diff --git a/benchmark/make-project/markdown-cc1.js b/benchmark/make-project/markdown-cc1.js
new file mode 100644
index 000000000000..6c83959601e3
--- /dev/null
+++ b/benchmark/make-project/markdown-cc1.js
@@ -0,0 +1,63 @@
+import fs from 'node:fs/promises';
+import { loremIpsumMd } from './_util.js';
+
+/**
+ * @param {URL} projectDir
+ */
+export async function run(projectDir) {
+ await fs.rm(projectDir, { recursive: true, force: true });
+ await fs.mkdir(new URL('./src/pages/blog', projectDir), { recursive: true });
+ await fs.mkdir(new URL('./src/content/blog', projectDir), { recursive: true });
+ await fs.copyFile(new URL('./image.jpg', import.meta.url), new URL('./src/image.jpg', projectDir));
+
+ const promises = [];
+
+
+ for (let i = 0; i < 10000; i++) {
+ const content = `\
+# Article ${i}
+
+${loremIpsumMd}
+
+![image ${i}](../../image.jpg)
+
+
+`;
+ promises.push(
+ fs.writeFile(new URL(`./src/content/blog/article-${i}.md`, projectDir), content, 'utf-8')
+ );
+ }
+
+
+ await fs.writeFile(
+ new URL(`./src/pages/blog/[...slug].astro`, projectDir),
+ `\
+---
+import { getCollection } from 'astro:content';
+export async function getStaticPaths() {
+ const blogEntries = await getCollection('blog');
+ return blogEntries.map(entry => ({
+ params: { slug: entry.slug }, props: { entry },
+ }));
+}
+const { entry } = Astro.props;
+const { Content } = await entry.render();
+---
+{entry.data.title}
+
+`,
+ 'utf-8'
+ );
+
+ await Promise.all(promises);
+
+ await fs.writeFile(
+ new URL('./astro.config.js', projectDir),
+ `\
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+});`,
+ 'utf-8'
+ );
+}
diff --git a/benchmark/make-project/markdown-cc2.js b/benchmark/make-project/markdown-cc2.js
new file mode 100644
index 000000000000..73c6afe7a8d0
--- /dev/null
+++ b/benchmark/make-project/markdown-cc2.js
@@ -0,0 +1,80 @@
+import fs from 'node:fs/promises';
+import { loremIpsumMd } from './_util.js';
+
+/**
+ * @param {URL} projectDir
+ */
+export async function run(projectDir) {
+ await fs.rm(projectDir, { recursive: true, force: true });
+ await fs.mkdir(new URL('./src/pages/blog', projectDir), { recursive: true });
+ await fs.mkdir(new URL('./data/blog', projectDir), { recursive: true });
+ await fs.mkdir(new URL('./src/content', projectDir), { recursive: true });
+ await fs.copyFile(new URL('./image.jpg', import.meta.url), new URL('./image.jpg', projectDir));
+
+ const promises = [];
+
+ for (let i = 0; i < 10000; i++) {
+ const content = `\
+# Article ${i}
+
+${loremIpsumMd}
+
+![image ${i}](../../image.jpg)
+
+`;
+ promises.push(
+ fs.writeFile(new URL(`./data/blog/article-${i}.md`, projectDir), content, 'utf-8')
+ );
+ }
+
+ await fs.writeFile(
+ new URL(`./src/content/config.ts`, projectDir),
+ /*ts */ `
+ import { defineCollection, z } from 'astro:content';
+ import { glob } from 'astro/loaders';
+
+ const blog = defineCollection({
+ loader: glob({ pattern: '*', base: './data/blog' }),
+ });
+
+ export const collections = { blog }
+
+ `
+ );
+
+ await fs.writeFile(
+ new URL(`./src/pages/blog/[...slug].astro`, projectDir),
+ `\
+---
+import { getCollection, render } from 'astro:content';
+export async function getStaticPaths() {
+ const blogEntries = await getCollection('blog');
+ return blogEntries.map(entry => ({
+ params: { slug: entry.id }, props: { entry },
+ }));
+}
+const { entry } = Astro.props;
+const { Content } = await render(entry);
+
+---
+{entry.data.title}
+
+`,
+ 'utf-8'
+ );
+
+ await Promise.all(promises);
+
+ await fs.writeFile(
+ new URL('./astro.config.js', projectDir),
+ `\
+import { defineConfig } from 'astro/config';
+
+export default defineConfig({
+ experimental: {
+ contentLayer: true
+ }
+});`,
+ 'utf-8'
+ );
+}
diff --git a/benchmark/make-project/mdx-cc1.js b/benchmark/make-project/mdx-cc1.js
new file mode 100644
index 000000000000..98e1495d13e1
--- /dev/null
+++ b/benchmark/make-project/mdx-cc1.js
@@ -0,0 +1,66 @@
+import fs from 'node:fs/promises';
+import { loremIpsumMd } from './_util.js';
+
+/**
+ * @param {URL} projectDir
+ */
+export async function run(projectDir) {
+ await fs.rm(projectDir, { recursive: true, force: true });
+ await fs.mkdir(new URL('./src/pages/blog', projectDir), { recursive: true });
+ await fs.mkdir(new URL('./src/content/blog', projectDir), { recursive: true });
+ await fs.copyFile(new URL('./image.jpg', import.meta.url), new URL('./src/image.jpg', projectDir));
+
+ const promises = [];
+
+
+ for (let i = 0; i < 10000; i++) {
+ const content = `\
+# Article ${i}
+
+${loremIpsumMd}
+
+![image ${i}](../../image.jpg)
+
+
+`;
+ promises.push(
+ fs.writeFile(new URL(`./src/content/blog/article-${i}.mdx`, projectDir), content, 'utf-8')
+ );
+ }
+
+
+ await fs.writeFile(
+ new URL(`./src/pages/blog/[...slug].astro`, projectDir),
+ `\
+---
+import { getCollection } from 'astro:content';
+export async function getStaticPaths() {
+ const blogEntries = await getCollection('blog');
+ return blogEntries.map(entry => ({
+ params: { slug: entry.slug }, props: { entry },
+ }));
+}
+const { entry } = Astro.props;
+const { Content } = await entry.render();
+---
+{entry.data.title}
+
+`,
+ 'utf-8'
+ );
+
+ await Promise.all(promises);
+
+ await fs.writeFile(
+ new URL('./astro.config.js', projectDir),
+ `\
+import { defineConfig } from 'astro/config';
+
+import mdx from '@astrojs/mdx';
+
+export default defineConfig({
+ integrations: [mdx()],
+});`,
+ 'utf-8'
+ );
+}
diff --git a/benchmark/make-project/mdx-cc2.js b/benchmark/make-project/mdx-cc2.js
new file mode 100644
index 000000000000..c08c2fb9fe23
--- /dev/null
+++ b/benchmark/make-project/mdx-cc2.js
@@ -0,0 +1,83 @@
+import fs from 'node:fs/promises';
+import { loremIpsumMd } from './_util.js';
+
+/**
+ * @param {URL} projectDir
+ */
+export async function run(projectDir) {
+ await fs.rm(projectDir, { recursive: true, force: true });
+ await fs.mkdir(new URL('./src/pages/blog', projectDir), { recursive: true });
+ await fs.mkdir(new URL('./data/blog', projectDir), { recursive: true });
+ await fs.mkdir(new URL('./src/content', projectDir), { recursive: true });
+ await fs.copyFile(new URL('./image.jpg', import.meta.url), new URL('./image.jpg', projectDir));
+
+ const promises = [];
+
+ for (let i = 0; i < 10000; i++) {
+ const content = `\
+# Article ${i}
+
+${loremIpsumMd}
+
+![image ${i}](../../image.jpg)
+
+`;
+ promises.push(
+ fs.writeFile(new URL(`./data/blog/article-${i}.mdx`, projectDir), content, 'utf-8')
+ );
+ }
+
+ await fs.writeFile(
+ new URL(`./src/content/config.ts`, projectDir),
+ /*ts */ `
+ import { defineCollection, z } from 'astro:content';
+ import { glob } from 'astro/loaders';
+
+ const blog = defineCollection({
+ loader: glob({ pattern: '*', base: './data/blog' }),
+ });
+
+ export const collections = { blog }
+
+ `
+ );
+
+ await fs.writeFile(
+ new URL(`./src/pages/blog/[...slug].astro`, projectDir),
+ `\
+---
+import { getCollection, render } from 'astro:content';
+export async function getStaticPaths() {
+ const blogEntries = await getCollection('blog');
+ return blogEntries.map(entry => ({
+ params: { slug: entry.id }, props: { entry },
+ }));
+}
+const { entry } = Astro.props;
+const { Content } = await render(entry);
+
+---
+{entry.data.title}
+
+`,
+ 'utf-8'
+ );
+
+ await Promise.all(promises);
+
+ await fs.writeFile(
+ new URL('./astro.config.js', projectDir),
+ `\
+import { defineConfig } from 'astro/config';
+
+import mdx from '@astrojs/mdx';
+
+export default defineConfig({
+ integrations: [mdx()],
+ experimental: {
+ contentLayer: true
+ }
+});`,
+ 'utf-8'
+ );
+}
diff --git a/benchmark/package.json b/benchmark/package.json
index 5f7206242b45..d56a6d1b0673 100644
--- a/benchmark/package.json
+++ b/benchmark/package.json
@@ -16,6 +16,7 @@
"markdown-table": "^3.0.3",
"mri": "^1.2.0",
"port-authority": "^2.0.1",
- "pretty-bytes": "^6.1.1"
+ "pretty-bytes": "^6.1.1",
+ "sharp": "^0.33.3"
}
}
diff --git a/biome.json b/biome.json
index 8effd9cfceb8..67e2a4620e0f 100644
--- a/biome.json
+++ b/biome.json
@@ -1,5 +1,5 @@
{
- "$schema": "https://biomejs.dev/schemas/1.8.1/schema.json",
+ "$schema": "https://biomejs.dev/schemas/1.8.3/schema.json",
"files": {
"ignore": [
"vendor",
@@ -26,7 +26,15 @@
"organizeImports": {
"enabled": true
},
- "linter": { "enabled": false },
+ "linter": {
+ "enabled": true,
+ "rules": {
+ "recommended": false,
+ "style": {
+ "useNodejsImportProtocol": "error"
+ }
+ }
+ },
"javascript": {
"formatter": {
"trailingCommas": "all",
diff --git a/examples/basics/package.json b/examples/basics/package.json
index b523cad78ba0..be4bf81ad1c6 100644
--- a/examples/basics/package.json
+++ b/examples/basics/package.json
@@ -11,6 +11,6 @@
"astro": "astro"
},
"dependencies": {
- "astro": "^4.13.3"
+ "astro": "^4.14.2"
}
}
diff --git a/examples/basics/src/env.d.ts b/examples/basics/src/env.d.ts
index f964fe0cffd8..9bc5cb41c24e 100644
--- a/examples/basics/src/env.d.ts
+++ b/examples/basics/src/env.d.ts
@@ -1 +1 @@
-///
+///
\ No newline at end of file
diff --git a/examples/blog/package.json b/examples/blog/package.json
index 21a14e62cf87..2b248d3a8d29 100644
--- a/examples/blog/package.json
+++ b/examples/blog/package.json
@@ -14,6 +14,6 @@
"@astrojs/mdx": "^3.1.3",
"@astrojs/rss": "^4.0.7",
"@astrojs/sitemap": "^3.1.6",
- "astro": "^4.13.3"
+ "astro": "^4.14.2"
}
}
diff --git a/examples/blog/src/env.d.ts b/examples/blog/src/env.d.ts
index acef35f175aa..e16c13c6952a 100644
--- a/examples/blog/src/env.d.ts
+++ b/examples/blog/src/env.d.ts
@@ -1,2 +1 @@
///
-///
diff --git a/examples/component/package.json b/examples/component/package.json
index 711f47ab6ccc..3d2e2bead498 100644
--- a/examples/component/package.json
+++ b/examples/component/package.json
@@ -15,7 +15,7 @@
],
"scripts": {},
"devDependencies": {
- "astro": "^4.13.3"
+ "astro": "^4.14.2"
},
"peerDependencies": {
"astro": "^4.0.0"
diff --git a/examples/container-with-vitest/package.json b/examples/container-with-vitest/package.json
index 59f4d937ff9c..1c673234054c 100644
--- a/examples/container-with-vitest/package.json
+++ b/examples/container-with-vitest/package.json
@@ -12,14 +12,14 @@
"test": "vitest run"
},
"dependencies": {
- "astro": "^4.13.3",
+ "astro": "^4.14.2",
"@astrojs/react": "^3.6.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"vitest": "^2.0.5"
},
"devDependencies": {
- "@types/react-dom": "^18.3.0",
- "@types/react": "^18.3.3"
+ "@types/react": "^18.3.3",
+ "@types/react-dom": "^18.3.0"
}
}
diff --git a/examples/framework-alpine/package.json b/examples/framework-alpine/package.json
index 6cd4bb07f8a6..03cfff656dbf 100644
--- a/examples/framework-alpine/package.json
+++ b/examples/framework-alpine/package.json
@@ -14,6 +14,6 @@
"@astrojs/alpinejs": "^0.4.0",
"@types/alpinejs": "^3.13.10",
"alpinejs": "^3.14.1",
- "astro": "^4.13.3"
+ "astro": "^4.14.2"
}
}
diff --git a/examples/framework-alpine/src/env.d.ts b/examples/framework-alpine/src/env.d.ts
index f964fe0cffd8..e16c13c6952a 100644
--- a/examples/framework-alpine/src/env.d.ts
+++ b/examples/framework-alpine/src/env.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/examples/framework-multiple/package.json b/examples/framework-multiple/package.json
index 49e0ce9712b5..626962d02e99 100644
--- a/examples/framework-multiple/package.json
+++ b/examples/framework-multiple/package.json
@@ -18,12 +18,12 @@
"@astrojs/vue": "^4.5.0",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
- "astro": "^4.13.3",
+ "astro": "^4.14.2",
"preact": "^10.23.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
- "solid-js": "^1.8.19",
+ "solid-js": "^1.8.20",
"svelte": "^4.2.18",
- "vue": "^3.4.35"
+ "vue": "^3.4.37"
}
}
diff --git a/examples/framework-multiple/src/env.d.ts b/examples/framework-multiple/src/env.d.ts
index f964fe0cffd8..e16c13c6952a 100644
--- a/examples/framework-multiple/src/env.d.ts
+++ b/examples/framework-multiple/src/env.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/examples/framework-preact/package.json b/examples/framework-preact/package.json
index 577bf5a514d5..d7169d6cc2e9 100644
--- a/examples/framework-preact/package.json
+++ b/examples/framework-preact/package.json
@@ -13,7 +13,7 @@
"dependencies": {
"@astrojs/preact": "^3.5.1",
"@preact/signals": "^1.3.0",
- "astro": "^4.13.3",
+ "astro": "^4.14.2",
"preact": "^10.23.1"
}
}
diff --git a/examples/framework-preact/src/env.d.ts b/examples/framework-preact/src/env.d.ts
index f964fe0cffd8..e16c13c6952a 100644
--- a/examples/framework-preact/src/env.d.ts
+++ b/examples/framework-preact/src/env.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/examples/framework-react/package.json b/examples/framework-react/package.json
index 5ee3222ad928..4fbde09c6476 100644
--- a/examples/framework-react/package.json
+++ b/examples/framework-react/package.json
@@ -14,7 +14,7 @@
"@astrojs/react": "^3.6.2",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
- "astro": "^4.13.3",
+ "astro": "^4.14.2",
"react": "^18.3.1",
"react-dom": "^18.3.1"
}
diff --git a/examples/framework-react/src/env.d.ts b/examples/framework-react/src/env.d.ts
index f964fe0cffd8..e16c13c6952a 100644
--- a/examples/framework-react/src/env.d.ts
+++ b/examples/framework-react/src/env.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/examples/framework-solid/package.json b/examples/framework-solid/package.json
index ae8ff13f124b..cc583f052e6e 100644
--- a/examples/framework-solid/package.json
+++ b/examples/framework-solid/package.json
@@ -12,7 +12,7 @@
},
"dependencies": {
"@astrojs/solid-js": "^4.4.1",
- "astro": "^4.13.3",
- "solid-js": "^1.8.19"
+ "astro": "^4.14.2",
+ "solid-js": "^1.8.20"
}
}
diff --git a/examples/framework-solid/src/env.d.ts b/examples/framework-solid/src/env.d.ts
index f964fe0cffd8..e16c13c6952a 100644
--- a/examples/framework-solid/src/env.d.ts
+++ b/examples/framework-solid/src/env.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/examples/framework-svelte/package.json b/examples/framework-svelte/package.json
index c8095dd91725..42a99cd2473a 100644
--- a/examples/framework-svelte/package.json
+++ b/examples/framework-svelte/package.json
@@ -12,7 +12,7 @@
},
"dependencies": {
"@astrojs/svelte": "^5.7.0",
- "astro": "^4.13.3",
+ "astro": "^4.14.2",
"svelte": "^4.2.18"
}
}
diff --git a/examples/framework-svelte/src/env.d.ts b/examples/framework-svelte/src/env.d.ts
index f964fe0cffd8..e16c13c6952a 100644
--- a/examples/framework-svelte/src/env.d.ts
+++ b/examples/framework-svelte/src/env.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/examples/framework-vue/package.json b/examples/framework-vue/package.json
index df136b65e7a9..1bff3df25d21 100644
--- a/examples/framework-vue/package.json
+++ b/examples/framework-vue/package.json
@@ -12,7 +12,7 @@
},
"dependencies": {
"@astrojs/vue": "^4.5.0",
- "astro": "^4.13.3",
- "vue": "^3.4.35"
+ "astro": "^4.14.2",
+ "vue": "^3.4.37"
}
}
diff --git a/examples/framework-vue/src/env.d.ts b/examples/framework-vue/src/env.d.ts
index f964fe0cffd8..e16c13c6952a 100644
--- a/examples/framework-vue/src/env.d.ts
+++ b/examples/framework-vue/src/env.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/examples/hackernews/package.json b/examples/hackernews/package.json
index e47cf63d7caf..bc5ee46b2c2b 100644
--- a/examples/hackernews/package.json
+++ b/examples/hackernews/package.json
@@ -11,7 +11,7 @@
"astro": "astro"
},
"dependencies": {
- "@astrojs/node": "^8.3.2",
- "astro": "^4.13.3"
+ "@astrojs/node": "^8.3.3",
+ "astro": "^4.14.2"
}
}
diff --git a/examples/hackernews/src/env.d.ts b/examples/hackernews/src/env.d.ts
index f964fe0cffd8..e16c13c6952a 100644
--- a/examples/hackernews/src/env.d.ts
+++ b/examples/hackernews/src/env.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/examples/integration/package.json b/examples/integration/package.json
index cd735e915fc9..d8225462a805 100644
--- a/examples/integration/package.json
+++ b/examples/integration/package.json
@@ -15,7 +15,7 @@
],
"scripts": {},
"devDependencies": {
- "astro": "^4.13.3"
+ "astro": "^4.14.2"
},
"peerDependencies": {
"astro": "^4.0.0"
diff --git a/examples/middleware/package.json b/examples/middleware/package.json
index 3a20bc13a485..db80ba2fe233 100644
--- a/examples/middleware/package.json
+++ b/examples/middleware/package.json
@@ -12,8 +12,8 @@
"server": "node dist/server/entry.mjs"
},
"dependencies": {
- "@astrojs/node": "^8.3.2",
- "astro": "^4.13.3",
+ "@astrojs/node": "^8.3.3",
+ "astro": "^4.14.2",
"html-minifier": "^4.0.0"
},
"devDependencies": {
diff --git a/examples/middleware/src/env.d.ts b/examples/middleware/src/env.d.ts
index 44f67965a3cc..74b9019e5746 100644
--- a/examples/middleware/src/env.d.ts
+++ b/examples/middleware/src/env.d.ts
@@ -1,4 +1,4 @@
-///
+///
declare namespace App {
interface Locals {
user: {
diff --git a/examples/minimal/package.json b/examples/minimal/package.json
index cb9e5b9f6891..129a0e1c68d6 100644
--- a/examples/minimal/package.json
+++ b/examples/minimal/package.json
@@ -11,6 +11,6 @@
"astro": "astro"
},
"dependencies": {
- "astro": "^4.13.3"
+ "astro": "^4.14.2"
}
}
diff --git a/examples/minimal/src/env.d.ts b/examples/minimal/src/env.d.ts
index f964fe0cffd8..e16c13c6952a 100644
--- a/examples/minimal/src/env.d.ts
+++ b/examples/minimal/src/env.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/examples/non-html-pages/package.json b/examples/non-html-pages/package.json
index c84aae0b1f8e..14750d84118e 100644
--- a/examples/non-html-pages/package.json
+++ b/examples/non-html-pages/package.json
@@ -11,6 +11,6 @@
"astro": "astro"
},
"dependencies": {
- "astro": "^4.13.3"
+ "astro": "^4.14.2"
}
}
diff --git a/examples/non-html-pages/src/env.d.ts b/examples/non-html-pages/src/env.d.ts
index f964fe0cffd8..e16c13c6952a 100644
--- a/examples/non-html-pages/src/env.d.ts
+++ b/examples/non-html-pages/src/env.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/examples/portfolio/package.json b/examples/portfolio/package.json
index faec95f81403..22e75e1419ea 100644
--- a/examples/portfolio/package.json
+++ b/examples/portfolio/package.json
@@ -11,6 +11,6 @@
"astro": "astro"
},
"dependencies": {
- "astro": "^4.13.3"
+ "astro": "^4.14.2"
}
}
diff --git a/examples/portfolio/src/env.d.ts b/examples/portfolio/src/env.d.ts
index acef35f175aa..e16c13c6952a 100644
--- a/examples/portfolio/src/env.d.ts
+++ b/examples/portfolio/src/env.d.ts
@@ -1,2 +1 @@
///
-///
diff --git a/examples/server-islands/package.json b/examples/server-islands/package.json
index 899f4d4af0ee..a3bf732943f2 100644
--- a/examples/server-islands/package.json
+++ b/examples/server-islands/package.json
@@ -10,17 +10,17 @@
"astro": "astro"
},
"devDependencies": {
- "@astrojs/node": "^8.3.2",
+ "@astrojs/node": "^8.3.3",
"@astrojs/react": "^3.6.2",
"@astrojs/tailwind": "^5.1.0",
"@fortawesome/fontawesome-free": "^6.6.0",
"@tailwindcss/forms": "^0.5.7",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
- "astro": "^4.13.3",
- "postcss": "^8.4.40",
+ "astro": "^4.14.2",
+ "postcss": "^8.4.41",
"react": "^18.3.1",
"react-dom": "^18.3.1",
- "tailwindcss": "^3.4.7"
+ "tailwindcss": "^3.4.9"
}
}
diff --git a/examples/ssr/package.json b/examples/ssr/package.json
index 530d4c9293ef..d35df0ec4c56 100644
--- a/examples/ssr/package.json
+++ b/examples/ssr/package.json
@@ -12,9 +12,9 @@
"server": "node dist/server/entry.mjs"
},
"dependencies": {
- "@astrojs/node": "^8.3.2",
+ "@astrojs/node": "^8.3.3",
"@astrojs/svelte": "^5.7.0",
- "astro": "^4.13.3",
+ "astro": "^4.14.2",
"svelte": "^4.2.18"
}
}
diff --git a/examples/ssr/src/env.d.ts b/examples/ssr/src/env.d.ts
index f964fe0cffd8..e16c13c6952a 100644
--- a/examples/ssr/src/env.d.ts
+++ b/examples/ssr/src/env.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/examples/starlog/package.json b/examples/starlog/package.json
index cfcc76527b25..905df4a69dfe 100644
--- a/examples/starlog/package.json
+++ b/examples/starlog/package.json
@@ -10,7 +10,7 @@
"astro": "astro"
},
"dependencies": {
- "astro": "^4.13.3",
+ "astro": "^4.14.2",
"sass": "^1.77.8",
"sharp": "^0.33.3"
}
diff --git a/examples/toolbar-app/package.json b/examples/toolbar-app/package.json
index 1c0d67f7f940..d08c29bca229 100644
--- a/examples/toolbar-app/package.json
+++ b/examples/toolbar-app/package.json
@@ -15,6 +15,6 @@
"./app": "./dist/app.js"
},
"devDependencies": {
- "astro": "^4.13.3"
+ "astro": "^4.14.2"
}
}
diff --git a/examples/view-transitions/package.json b/examples/view-transitions/package.json
index 42b1401b05b2..7448b9ec0a8f 100644
--- a/examples/view-transitions/package.json
+++ b/examples/view-transitions/package.json
@@ -11,7 +11,7 @@
},
"devDependencies": {
"@astrojs/tailwind": "^5.1.0",
- "@astrojs/node": "^8.3.2",
- "astro": "^4.13.3"
+ "@astrojs/node": "^8.3.3",
+ "astro": "^4.14.2"
}
}
diff --git a/examples/with-markdoc/package.json b/examples/with-markdoc/package.json
index dbc01d6ba3d9..1af3bc63c152 100644
--- a/examples/with-markdoc/package.json
+++ b/examples/with-markdoc/package.json
@@ -12,6 +12,6 @@
},
"dependencies": {
"@astrojs/markdoc": "^0.11.3",
- "astro": "^4.13.3"
+ "astro": "^4.14.2"
}
}
diff --git a/examples/with-markdoc/src/env.d.ts b/examples/with-markdoc/src/env.d.ts
index acef35f175aa..e16c13c6952a 100644
--- a/examples/with-markdoc/src/env.d.ts
+++ b/examples/with-markdoc/src/env.d.ts
@@ -1,2 +1 @@
///
-///
diff --git a/examples/with-markdown-plugins/package.json b/examples/with-markdown-plugins/package.json
index 5dfb45ea0f3e..61f1253458f9 100644
--- a/examples/with-markdown-plugins/package.json
+++ b/examples/with-markdown-plugins/package.json
@@ -12,7 +12,7 @@
},
"dependencies": {
"@astrojs/markdown-remark": "^5.2.0",
- "astro": "^4.13.3",
+ "astro": "^4.14.2",
"hast-util-select": "^6.0.2",
"rehype-autolink-headings": "^7.1.0",
"rehype-slug": "^6.0.0",
diff --git a/examples/with-markdown-plugins/src/env.d.ts b/examples/with-markdown-plugins/src/env.d.ts
index f964fe0cffd8..e16c13c6952a 100644
--- a/examples/with-markdown-plugins/src/env.d.ts
+++ b/examples/with-markdown-plugins/src/env.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/examples/with-markdown-shiki/package.json b/examples/with-markdown-shiki/package.json
index 511e370f540a..e1486a376a88 100644
--- a/examples/with-markdown-shiki/package.json
+++ b/examples/with-markdown-shiki/package.json
@@ -11,6 +11,6 @@
"astro": "astro"
},
"dependencies": {
- "astro": "^4.13.3"
+ "astro": "^4.14.2"
}
}
diff --git a/examples/with-markdown-shiki/src/env.d.ts b/examples/with-markdown-shiki/src/env.d.ts
index f964fe0cffd8..e16c13c6952a 100644
--- a/examples/with-markdown-shiki/src/env.d.ts
+++ b/examples/with-markdown-shiki/src/env.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/examples/with-mdx/package.json b/examples/with-mdx/package.json
index 20bb7349c9a5..934959975cd8 100644
--- a/examples/with-mdx/package.json
+++ b/examples/with-mdx/package.json
@@ -13,7 +13,7 @@
"dependencies": {
"@astrojs/mdx": "^3.1.3",
"@astrojs/preact": "^3.5.1",
- "astro": "^4.13.3",
+ "astro": "^4.14.2",
"preact": "^10.23.1"
}
}
diff --git a/examples/with-mdx/src/env.d.ts b/examples/with-mdx/src/env.d.ts
index f964fe0cffd8..e16c13c6952a 100644
--- a/examples/with-mdx/src/env.d.ts
+++ b/examples/with-mdx/src/env.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/examples/with-nanostores/package.json b/examples/with-nanostores/package.json
index 8933b0bac495..b8db777b4225 100644
--- a/examples/with-nanostores/package.json
+++ b/examples/with-nanostores/package.json
@@ -13,8 +13,8 @@
"dependencies": {
"@astrojs/preact": "^3.5.1",
"@nanostores/preact": "^0.5.2",
- "astro": "^4.13.3",
- "nanostores": "^0.11.0",
+ "astro": "^4.14.2",
+ "nanostores": "^0.11.2",
"preact": "^10.23.1"
}
}
diff --git a/examples/with-nanostores/src/env.d.ts b/examples/with-nanostores/src/env.d.ts
index f964fe0cffd8..e16c13c6952a 100644
--- a/examples/with-nanostores/src/env.d.ts
+++ b/examples/with-nanostores/src/env.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/examples/with-tailwindcss/package.json b/examples/with-tailwindcss/package.json
index ae2329dd69bc..80ba691d86c0 100644
--- a/examples/with-tailwindcss/package.json
+++ b/examples/with-tailwindcss/package.json
@@ -14,10 +14,10 @@
"@astrojs/mdx": "^3.1.3",
"@astrojs/tailwind": "^5.1.0",
"@types/canvas-confetti": "^1.6.4",
- "astro": "^4.13.3",
+ "astro": "^4.14.2",
"autoprefixer": "^10.4.20",
"canvas-confetti": "^1.9.3",
- "postcss": "^8.4.40",
- "tailwindcss": "^3.4.7"
+ "postcss": "^8.4.41",
+ "tailwindcss": "^3.4.9"
}
}
diff --git a/examples/with-tailwindcss/src/env.d.ts b/examples/with-tailwindcss/src/env.d.ts
index f964fe0cffd8..e16c13c6952a 100644
--- a/examples/with-tailwindcss/src/env.d.ts
+++ b/examples/with-tailwindcss/src/env.d.ts
@@ -1 +1 @@
-///
+///
diff --git a/examples/with-vitest/package.json b/examples/with-vitest/package.json
index 738dac867d18..88956a94eb43 100644
--- a/examples/with-vitest/package.json
+++ b/examples/with-vitest/package.json
@@ -12,7 +12,7 @@
"test": "vitest"
},
"dependencies": {
- "astro": "^4.13.3",
+ "astro": "^4.14.2",
"vitest": "^2.0.5"
}
}
diff --git a/package.json b/package.json
index 8417847d811f..850816b5e115 100644
--- a/package.json
+++ b/package.json
@@ -35,7 +35,7 @@
"test:e2e:match": "cd packages/astro && pnpm playwright install chromium firefox && pnpm run test:e2e:match",
"test:e2e:hosts": "turbo run test:hosted",
"benchmark": "astro-benchmark",
- "lint": "eslint . --report-unused-disable-directives",
+ "lint": "biome lint && eslint . --report-unused-disable-directives",
"version": "changeset version && node ./scripts/deps/update-example-versions.js && pnpm install --no-frozen-lockfile && pnpm run format",
"preinstall": "npx only-allow pnpm"
},
@@ -52,20 +52,20 @@
"astro-benchmark": "workspace:*"
},
"devDependencies": {
- "@astrojs/check": "^0.9.1",
- "@biomejs/biome": "1.8.1",
+ "@astrojs/check": "^0.9.2",
+ "@biomejs/biome": "1.8.3",
"@changesets/changelog-github": "^0.5.0",
"@changesets/cli": "^2.27.7",
"@types/node": "^18.17.8",
"esbuild": "^0.21.5",
- "eslint": "^9.8.0",
+ "eslint": "^9.9.0",
"eslint-plugin-no-only-tests": "^3.1.0",
"eslint-plugin-regexp": "^2.6.0",
"globby": "^14.0.2",
"only-allow": "^1.2.1",
"prettier": "^3.3.3",
"prettier-plugin-astro": "^0.14.1",
- "turbo": "^1.13.4",
+ "turbo": "^2.0.12",
"typescript": "~5.5.4",
"typescript-eslint": "^8.0.1"
},
diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md
index c183b7afbb4a..5c93709a4b30 100644
--- a/packages/astro/CHANGELOG.md
+++ b/packages/astro/CHANGELOG.md
@@ -1,5 +1,261 @@
# astro
+## 4.14.2
+
+### Patch Changes
+
+- [#11733](https://github.com/withastro/astro/pull/11733) [`391324d`](https://github.com/withastro/astro/commit/391324df969db71d1c7ca25c2ed14c9eb6eea5ee) Thanks [@bluwy](https://github.com/bluwy)! - Reverts back to `yargs-parser` package for CLI argument parsing
+
+## 4.14.1
+
+### Patch Changes
+
+- [#11725](https://github.com/withastro/astro/pull/11725) [`6c1560f`](https://github.com/withastro/astro/commit/6c1560fb0d19ce659bc9f9090f8050254d5c03f3) Thanks [@ascorbic](https://github.com/ascorbic)! - Prevents content layer importing node builtins in runtime
+
+- [#11692](https://github.com/withastro/astro/pull/11692) [`35af73a`](https://github.com/withastro/astro/commit/35af73aace97a7cc898b9aa5040db8bc2ac62687) Thanks [@matthewp](https://github.com/matthewp)! - Prevent errant HTML from crashing server islands
+
+ When an HTML minifier strips away the server island comment, the script can't correctly know where the end of the fallback content is. This makes it so that it simply doesn't remove any DOM in that scenario. This means the fallback isn't removed, but it also doesn't crash the browser.
+
+- [#11727](https://github.com/withastro/astro/pull/11727) [`3c2f93b`](https://github.com/withastro/astro/commit/3c2f93b66c6b8e9d2ab58e2cbe941c14ffab89b5) Thanks [@florian-lefebvre](https://github.com/florian-lefebvre)! - Fixes a type issue when using the Content Layer in dev
+
+## 4.14.0
+
+### Minor Changes
+
+- [#11657](https://github.com/withastro/astro/pull/11657) [`a23c69d`](https://github.com/withastro/astro/commit/a23c69d0d0bed229bee52a32e61f135f9ebf9122) Thanks [@bluwy](https://github.com/bluwy)! - Deprecates the option for route-generating files to export a dynamic value for `prerender`. Only static values are now supported (e.g. `export const prerender = true` or `= false`). This allows for better treeshaking and bundling configuration in the future.
+
+ Adds a new [`"astro:route:setup"` hook](https://docs.astro.build/en/reference/integrations-reference/#astroroutesetup) to the Integrations API to allow you to dynamically set options for a route at build or request time through an integration, such as enabling [on-demand server rendering](https://docs.astro.build/en/guides/server-side-rendering/#opting-in-to-pre-rendering-in-server-mode).
+
+ To migrate from a dynamic export to the new hook, update or remove any dynamic `prerender` exports from individual routing files:
+
+ ```diff
+ // src/pages/blog/[slug].astro
+ - export const prerender = import.meta.env.PRERENDER
+ ```
+
+ Instead, create an integration with the `"astro:route:setup"` hook and update the route's `prerender` option:
+
+ ```js
+ // astro.config.mjs
+ import { defineConfig } from 'astro/config';
+ import { loadEnv } from 'vite';
+
+ export default defineConfig({
+ integrations: [setPrerender()],
+ });
+
+ function setPrerender() {
+ const { PRERENDER } = loadEnv(process.env.NODE_ENV, process.cwd(), '');
+
+ return {
+ name: 'set-prerender',
+ hooks: {
+ 'astro:route:setup': ({ route }) => {
+ if (route.component.endsWith('/blog/[slug].astro')) {
+ route.prerender = PRERENDER;
+ }
+ },
+ },
+ };
+ }
+ ```
+
+- [#11360](https://github.com/withastro/astro/pull/11360) [`a79a8b0`](https://github.com/withastro/astro/commit/a79a8b0230b06ed32ce1802f2a5f84a6cf92dbe7) Thanks [@ascorbic](https://github.com/ascorbic)! - Adds a new [`injectTypes()` utility](https://docs.astro.build/en/reference/integrations-reference/#injecttypes-options) to the Integration API and refactors how type generation works
+
+ Use `injectTypes()` in the `astro:config:done` hook to inject types into your user's project by adding a new a `*.d.ts` file.
+
+ The `filename` property will be used to generate a file at `/.astro/integrations//.d.ts` and must end with `".d.ts"`.
+
+ The `content` property will create the body of the file, and must be valid TypeScript.
+
+ Additionally, `injectTypes()` returns a URL to the normalized path so you can overwrite its content later on, or manipulate it in any way you want.
+
+ ```js
+ // my-integration/index.js
+ export default {
+ name: 'my-integration',
+ 'astro:config:done': ({ injectTypes }) => {
+ injectTypes({
+ filename: 'types.d.ts',
+ content: "declare module 'virtual:my-integration' {}",
+ });
+ },
+ };
+ ```
+
+ Codegen has been refactored. Although `src/env.d.ts` will continue to work as is, we recommend you update it:
+
+ ```diff
+ - ///
+ + ///
+ - ///
+ - ///
+ ```
+
+- [#11605](https://github.com/withastro/astro/pull/11605) [`d3d99fb`](https://github.com/withastro/astro/commit/d3d99fba269da9e812e748539a11dfed785ef8a4) Thanks [@jcayzac](https://github.com/jcayzac)! - Adds a new property `meta` to Astro's [built-in `
` component](https://docs.astro.build/en/reference/api-reference/#code-).
+
+ This allows you to provide a value for [Shiki's `meta` attribute](https://shiki.style/guide/transformers#meta) to pass options to transformers.
+
+ The following example passes an option to highlight lines 1 and 3 to Shiki's `tranformerMetaHighlight`:
+
+ ```astro
+ ---
+ // src/components/Card.astro
+ import { Code } from 'astro:components';
+ import { transformerMetaHighlight } from '@shikijs/transformers';
+ ---
+
+
+ ```
+
+- [#11360](https://github.com/withastro/astro/pull/11360) [`a79a8b0`](https://github.com/withastro/astro/commit/a79a8b0230b06ed32ce1802f2a5f84a6cf92dbe7) Thanks [@ascorbic](https://github.com/ascorbic)! - Adds support for Intellisense features (e.g. code completion, quick hints) for your content collection entries in compatible editors under the `experimental.contentIntellisense` flag.
+
+ ```js
+ import { defineConfig } from 'astro';
+
+ export default defineConfig({
+ experimental: {
+ contentIntellisense: true,
+ },
+ });
+ ```
+
+ When enabled, this feature will generate and add JSON schemas to the `.astro` directory in your project. These files can be used by the Astro language server to provide Intellisense inside content files (`.md`, `.mdx`, `.mdoc`).
+
+ Note that at this time, this also require enabling the `astro.content-intellisense` option in your editor, or passing the `contentIntellisense: true` initialization parameter to the Astro language server for editors using it directly.
+
+ See the [experimental content Intellisense docs](https://docs.astro.build/en/reference/configuration-reference/#experimentalcontentintellisense) for more information updates as this feature develops.
+
+- [#11360](https://github.com/withastro/astro/pull/11360) [`a79a8b0`](https://github.com/withastro/astro/commit/a79a8b0230b06ed32ce1802f2a5f84a6cf92dbe7) Thanks [@ascorbic](https://github.com/ascorbic)! - Adds experimental support for the Content Layer API.
+
+ The new Content Layer API builds upon content collections, taking them beyond local files in `src/content/` and allowing you to fetch content from anywhere, including remote APIs. These new collections work alongside your existing content collections, and you can migrate them to the new API at your own pace. There are significant improvements to performance with large collections of local files.
+
+ ### Getting started
+
+ To try out the new Content Layer API, enable it in your Astro config:
+
+ ```js
+ import { defineConfig } from 'astro';
+
+ export default defineConfig({
+ experimental: {
+ contentLayer: true,
+ },
+ });
+ ```
+
+ You can then create collections in your `src/content/config.ts` using the Content Layer API.
+
+ ### Loading your content
+
+ The core of the new Content Layer API is the loader, a function that fetches content from a source and caches it in a local data store. Astro 4.14 ships with built-in `glob()` and `file()` loaders to handle your local Markdown, MDX, Markdoc, and JSON files:
+
+ ```ts {3,7}
+ // src/content/config.ts
+ import { defineCollection, z } from 'astro:content';
+ import { glob } from 'astro/loaders';
+
+ const blog = defineCollection({
+ // The ID is a slug generated from the path of the file relative to `base`
+ loader: glob({ pattern: '**/*.md', base: './src/data/blog' }),
+ schema: z.object({
+ title: z.string(),
+ description: z.string(),
+ publishDate: z.coerce.date(),
+ }),
+ });
+
+ export const collections = { blog };
+ ```
+
+ You can then query using the existing content collections functions, and enjoy a simplified `render()` function to display your content:
+
+ ```astro
+ ---
+ import { getEntry, render } from 'astro:content';
+
+ const post = await getEntry('blog', Astro.params.slug);
+
+ const { Content } = await render(entry);
+ ---
+
+
+ ```
+
+ ### Creating a loader
+
+ You're not restricted to the built-in loaders – we hope you'll try building your own. You can fetch content from anywhere and return an array of entries:
+
+ ```ts
+ // src/content/config.ts
+ const countries = defineCollection({
+ loader: async () => {
+ const response = await fetch('https://restcountries.com/v3.1/all');
+ const data = await response.json();
+ // Must return an array of entries with an id property,
+ // or an object with IDs as keys and entries as values
+ return data.map((country) => ({
+ id: country.cca3,
+ ...country,
+ }));
+ },
+ // optionally add a schema to validate the data and make it type-safe for users
+ // schema: z.object...
+ });
+
+ export const collections = { countries };
+ ```
+
+ For more advanced loading logic, you can define an object loader. This allows incremental updates and conditional loading, and gives full access to the data store. It also allows a loader to define its own schema, including generating it dynamically based on the source API. See the [the Content Layer API RFC](https://github.com/withastro/roadmap/blob/content-layer/proposals/0047-content-layer.md#loaders) for more details.
+
+ ### Sharing your loaders
+
+ Loaders are better when they're shared. You can create a package that exports a loader and publish it to npm, and then anyone can use it on their site. We're excited to see what the community comes up with! To get started, [take a look at some examples](https://github.com/ascorbic/astro-loaders/). Here's how to load content using an RSS/Atom feed loader:
+
+ ```ts
+ // src/content/config.ts
+ import { defineCollection } from 'astro:content';
+ import { feedLoader } from '@ascorbic/feed-loader';
+
+ const podcasts = defineCollection({
+ loader: feedLoader({
+ url: 'https://feeds.99percentinvisible.org/99percentinvisible',
+ }),
+ });
+
+ export const collections = { podcasts };
+ ```
+
+ ### Learn more
+
+ To find out more about using the Content Layer API, check out [the Content Layer RFC](https://github.com/withastro/roadmap/blob/content-layer/proposals/0047-content-layer.md) and [share your feedback](https://github.com/withastro/roadmap/pull/982).
+
+### Patch Changes
+
+- [#11716](https://github.com/withastro/astro/pull/11716) [`f4057c1`](https://github.com/withastro/astro/commit/f4057c18c91f969e3e508545fb988aff94c3ff08) Thanks [@florian-lefebvre](https://github.com/florian-lefebvre)! - Fixes content types sync in dev
+
+- [#11645](https://github.com/withastro/astro/pull/11645) [`849e4c6`](https://github.com/withastro/astro/commit/849e4c6c23e61f7fa59f583419048b998bef2475) Thanks [@bluwy](https://github.com/bluwy)! - Refactors internally to use `node:util` `parseArgs` instead of `yargs-parser`
+
+- [#11712](https://github.com/withastro/astro/pull/11712) [`791d809`](https://github.com/withastro/astro/commit/791d809cbc22ed30dda1195ca026daa46a54b551) Thanks [@matthewp](https://github.com/matthewp)! - Fix mixed use of base + trailingSlash in Server Islands
+
+- [#11709](https://github.com/withastro/astro/pull/11709) [`3d8ae76`](https://github.com/withastro/astro/commit/3d8ae767fd4952af7332542b58fe98886eb2e99e) Thanks [@matthewp](https://github.com/matthewp)! - Fix adapter causing Netlify to break
+
+## 4.13.4
+
+### Patch Changes
+
+- [#11678](https://github.com/withastro/astro/pull/11678) [`34da907`](https://github.com/withastro/astro/commit/34da907f3b4fb411024e6d28fdb291fa78116950) Thanks [@ematipico](https://github.com/ematipico)! - Fixes a case where omitting a semicolon and line ending with carriage return - CRLF - in the `prerender` option could throw an error.
+
+- [#11535](https://github.com/withastro/astro/pull/11535) [`932bd2e`](https://github.com/withastro/astro/commit/932bd2eb07f1d7cb2c91e7e7d31fe84c919e302b) Thanks [@matthewp](https://github.com/matthewp)! - Encrypt server island props
+
+ Server island props are now encrypted with a key generated at build-time. This is intended to prevent accidentally leaking secrets caused by exposing secrets through prop-passing. This is not intended to allow a server island to be trusted to skip authentication, or to protect against any other vulnerabilities other than secret leakage.
+
+ See the RFC for an explanation: https://github.com/withastro/roadmap/blob/server-islands/proposals/server-islands.md#props-serialization
+
+- [#11655](https://github.com/withastro/astro/pull/11655) [`dc0a297`](https://github.com/withastro/astro/commit/dc0a297e2a4bea3db8310cc98c51b2f94ede5fde) Thanks [@billy-le](https://github.com/billy-le)! - Fixes Astro Actions `input` validation when using `default` values with a form input.
+
+- [#11689](https://github.com/withastro/astro/pull/11689) [`c7bda4c`](https://github.com/withastro/astro/commit/c7bda4cd672864babc3cebd19a2dd2e1af85c087) Thanks [@ematipico](https://github.com/ematipico)! - Fixes an issue in the Astro actions, where the size of the generated cookie was exceeding the size permitted by the `Set-Cookie` header.
+
## 4.13.3
### Patch Changes
@@ -7562,7 +7818,7 @@
## 2.0.0
> **Note**
-> This is a detailed changelog of all changes in Astro v2.
+> This is a detailed changelog of all changes in Astro v2.
> See our [upgrade guide](https://docs.astro.build/en/guides/upgrade-to/v2/) for an overview of steps needed to upgrade an existing project.
### Major Changes
diff --git a/packages/astro/astro-jsx.d.ts b/packages/astro/astro-jsx.d.ts
index b26507d1db58..128709dfc528 100644
--- a/packages/astro/astro-jsx.d.ts
+++ b/packages/astro/astro-jsx.d.ts
@@ -17,23 +17,21 @@ declare namespace astroHTML.JSX {
children: {};
}
- interface IntrinsicAttributes
- extends AstroBuiltinProps,
- AstroBuiltinAttributes,
- AstroClientDirectives {
+ interface IntrinsicAttributes extends AstroComponentDirectives, AstroBuiltinAttributes {
slot?: string | undefined | null;
children?: Children;
}
- type AstroBuiltinProps = import('./dist/@types/astro.js').AstroBuiltinProps;
- type AstroClientDirectives = import('./dist/@types/astro.js').AstroClientDirectives;
- type AstroBuiltinAttributes = import('./dist/@types/astro.js').AstroBuiltinAttributes;
- type AstroDefineVarsAttribute = import('./dist/@types/astro.js').AstroDefineVarsAttribute;
- type AstroScriptAttributes = import('./dist/@types/astro.js').AstroScriptAttributes &
+ type AstroComponentDirectives =
+ import('./dist/types/public/elements.js').AstroComponentDirectives;
+ type AstroBuiltinAttributes = import('./dist/types/public/elements.js').AstroBuiltinAttributes;
+ type AstroDefineVarsAttribute =
+ import('./dist/types/public/elements.js').AstroDefineVarsAttribute;
+ type AstroScriptAttributes = import('./dist/types/public/elements.js').AstroScriptAttributes &
AstroDefineVarsAttribute;
- type AstroStyleAttributes = import('./dist/@types/astro.js').AstroStyleAttributes &
+ type AstroStyleAttributes = import('./dist/types/public/elements.js').AstroStyleAttributes &
AstroDefineVarsAttribute;
- type AstroSlotAttributes = import('./dist/@types/astro.js').AstroSlotAttributes;
+ type AstroSlotAttributes = import('./dist/types/public/elements.js').AstroSlotAttributes;
// This is an unfortunate use of `any`, but unfortunately we can't make a type that works for every framework
// without importing every single framework's types (which comes with its own set of problems).
diff --git a/packages/astro/client.d.ts b/packages/astro/client.d.ts
index ed5c1b894d28..796bf3f33deb 100644
--- a/packages/astro/client.d.ts
+++ b/packages/astro/client.d.ts
@@ -2,12 +2,6 @@
///
///
-// eslint-disable-next-line @typescript-eslint/no-namespace
-declare namespace App {
- // eslint-disable-next-line @typescript-eslint/no-empty-interface
- export interface Locals {}
-}
-
interface ImportMetaEnv {
/**
* The prefix for Astro-generated asset links if the build.assetsPrefix config option is set. This can be used to create asset links not handled by Astro.
@@ -52,7 +46,7 @@ declare module 'astro:assets' {
getImage: (
options: import('./dist/assets/types.js').UnresolvedImageTransform,
) => Promise;
- imageConfig: import('./dist/@types/astro.js').AstroConfig['image'];
+ imageConfig: import('./dist/types/public/config.js').AstroConfig['image'];
getConfiguredImageService: typeof import('./dist/assets/index.js').getConfiguredImageService;
inferRemoteSize: typeof import('./dist/assets/utils/index.js').inferRemoteSize;
Image: typeof import('./components/Image.astro').default;
@@ -172,7 +166,7 @@ declare module 'astro:components' {
export * from 'astro/components';
}
-type MD = import('./dist/@types/astro.js').MarkdownInstance>;
+type MD = import('./dist/types/public/content.js').MarkdownInstance>;
interface ExportedMarkdownModuleEntities {
frontmatter: MD['frontmatter'];
file: MD['file'];
@@ -191,7 +185,6 @@ declare module '*.md' {
file,
url,
getHeadings,
- getHeaders,
Content,
rawContent,
compiledContent,
@@ -206,7 +199,6 @@ declare module '*.markdown' {
file,
url,
getHeadings,
- getHeaders,
Content,
rawContent,
compiledContent,
@@ -221,7 +213,6 @@ declare module '*.mkdn' {
file,
url,
getHeadings,
- getHeaders,
Content,
rawContent,
compiledContent,
@@ -236,7 +227,6 @@ declare module '*.mkd' {
file,
url,
getHeadings,
- getHeaders,
Content,
rawContent,
compiledContent,
@@ -251,7 +241,6 @@ declare module '*.mdwn' {
file,
url,
getHeadings,
- getHeaders,
Content,
rawContent,
compiledContent,
@@ -266,7 +255,6 @@ declare module '*.mdown' {
file,
url,
getHeadings,
- getHeaders,
Content,
rawContent,
compiledContent,
@@ -275,7 +263,7 @@ declare module '*.mdown' {
}
declare module '*.mdx' {
- type MDX = import('./dist/@types/astro.js').MDXInstance>;
+ type MDX = import('./dist/types/public/content.js').MDXInstance>;
export const frontmatter: MDX['frontmatter'];
export const file: MDX['file'];
@@ -288,7 +276,7 @@ declare module '*.mdx' {
}
declare module 'astro:ssr-manifest' {
- export const manifest: import('./dist/@types/astro.js').SSRManifest;
+ export const manifest: import('./dist/types/public/internal.js').SSRManifest;
}
// Everything below are Vite's types (apart from image types, which are in `client.d.ts`)
diff --git a/packages/astro/components/Code.astro b/packages/astro/components/Code.astro
index 0cc639d7d577..8818b2ae0d27 100644
--- a/packages/astro/components/Code.astro
+++ b/packages/astro/components/Code.astro
@@ -23,6 +23,13 @@ interface Props extends Omit, 'lang'> {
* @default "plaintext"
*/
lang?: BuiltinLanguage | SpecialLanguage | LanguageRegistration;
+ /**
+ * A metastring to pass to the highlighter.
+ * Allows passing information to transformers: https://shiki.style/guide/transformers#meta
+ *
+ * @default undefined
+ */
+ meta?: string;
/**
* The styling theme.
* Supports all themes listed here: https://shiki.style/themes
@@ -72,6 +79,7 @@ interface Props extends Omit, 'lang'> {
const {
code,
lang = 'plaintext',
+ meta,
theme = 'github-dark',
themes = {},
defaultColor = 'light',
@@ -110,6 +118,7 @@ const highlighter = await getCachedHighlighter({
const html = await highlighter.highlight(code, typeof lang === 'string' ? lang : lang.name, {
inline,
+ meta,
attributes: rest as any,
});
---
diff --git a/packages/astro/components/Picture.astro b/packages/astro/components/Picture.astro
index c85548404d29..6686faf15bbe 100644
--- a/packages/astro/components/Picture.astro
+++ b/packages/astro/components/Picture.astro
@@ -1,7 +1,7 @@
---
import { type LocalImageProps, type RemoteImageProps, getImage } from 'astro:assets';
import * as mime from 'mrmime';
-import type { GetImageResult, ImageOutputFormat } from '../dist/@types/astro';
+import type { GetImageResult, ImageOutputFormat } from '../dist/types/public/index.js';
import { isESMImportedImage, resolveSrc } from '../dist/assets/utils/imageKind';
import { AstroError, AstroErrorData } from '../dist/core/errors/index.js';
import type { HTMLAttributes } from '../types';
diff --git a/packages/astro/config.d.ts b/packages/astro/config.d.ts
index 9f4c6bfd112d..675c783a191d 100644
--- a/packages/astro/config.d.ts
+++ b/packages/astro/config.d.ts
@@ -1,8 +1,8 @@
type ViteUserConfig = import('vite').UserConfig;
type ViteUserConfigFn = import('vite').UserConfigFn;
-type AstroUserConfig = import('./dist/@types/astro.js').AstroUserConfig;
-type AstroInlineConfig = import('./dist/@types/astro.js').AstroInlineConfig;
-type ImageServiceConfig = import('./dist/@types/astro.js').ImageServiceConfig;
+type AstroUserConfig = import('./dist/types/public/config.js').AstroUserConfig;
+type AstroInlineConfig = import('./dist/types/public/config.js').AstroInlineConfig;
+type ImageServiceConfig = import('./dist/types/public/config.js').ImageServiceConfig;
type SharpImageServiceConfig = import('./dist/assets/services/sharp.js').SharpImageServiceConfig;
type EnvField = typeof import('./dist/env/config.js').envField;
@@ -42,4 +42,4 @@ export function passthroughImageService(): ImageServiceConfig;
/**
* Return a valid env field to use in this Astro config for `experimental.env.schema`.
*/
-export const envField: EnvField;
+export declare const envField: EnvField;
diff --git a/packages/astro/e2e/fixtures/actions-blog/package.json b/packages/astro/e2e/fixtures/actions-blog/package.json
index 35e036ee01ff..311b7a37884f 100644
--- a/packages/astro/e2e/fixtures/actions-blog/package.json
+++ b/packages/astro/e2e/fixtures/actions-blog/package.json
@@ -10,7 +10,7 @@
"astro": "astro"
},
"dependencies": {
- "@astrojs/check": "^0.9.1",
+ "@astrojs/check": "^0.9.2",
"@astrojs/db": "workspace:*",
"@astrojs/node": "workspace:*",
"@astrojs/react": "workspace:*",
diff --git a/packages/astro/e2e/fixtures/actions-react-19/package.json b/packages/astro/e2e/fixtures/actions-react-19/package.json
index d67b081e23ae..a0f446eb9591 100644
--- a/packages/astro/e2e/fixtures/actions-react-19/package.json
+++ b/packages/astro/e2e/fixtures/actions-react-19/package.json
@@ -10,7 +10,7 @@
"astro": "astro"
},
"dependencies": {
- "@astrojs/check": "^0.9.1",
+ "@astrojs/check": "^0.9.2",
"@astrojs/db": "workspace:*",
"@astrojs/node": "workspace:*",
"@astrojs/react": "workspace:*",
diff --git a/packages/astro/e2e/fixtures/astro-envs/package.json b/packages/astro/e2e/fixtures/astro-envs/package.json
index a2e272e8b2db..bc11078b8c65 100644
--- a/packages/astro/e2e/fixtures/astro-envs/package.json
+++ b/packages/astro/e2e/fixtures/astro-envs/package.json
@@ -5,6 +5,6 @@
"dependencies": {
"@astrojs/vue": "workspace:*",
"astro": "workspace:*",
- "vue": "^3.4.35"
+ "vue": "^3.4.37"
}
}
diff --git a/packages/astro/e2e/fixtures/client-only/package.json b/packages/astro/e2e/fixtures/client-only/package.json
index 6af924c3d4b7..2a1ce6d7f157 100644
--- a/packages/astro/e2e/fixtures/client-only/package.json
+++ b/packages/astro/e2e/fixtures/client-only/package.json
@@ -14,8 +14,8 @@
"preact": "^10.23.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
- "solid-js": "^1.8.19",
+ "solid-js": "^1.8.20",
"svelte": "^4.2.18",
- "vue": "^3.4.35"
+ "vue": "^3.4.37"
}
}
diff --git a/packages/astro/e2e/fixtures/errors/package.json b/packages/astro/e2e/fixtures/errors/package.json
index e6216ea15b79..2bd6a5fd3bbb 100644
--- a/packages/astro/e2e/fixtures/errors/package.json
+++ b/packages/astro/e2e/fixtures/errors/package.json
@@ -13,8 +13,8 @@
"react": "^18.3.1",
"react-dom": "^18.3.1",
"sass": "^1.77.8",
- "solid-js": "^1.8.19",
+ "solid-js": "^1.8.20",
"svelte": "^4.2.18",
- "vue": "^3.4.35"
+ "vue": "^3.4.37"
}
}
diff --git a/packages/astro/e2e/fixtures/multiple-frameworks/package.json b/packages/astro/e2e/fixtures/multiple-frameworks/package.json
index 5fd1905f5800..8bf507751f47 100644
--- a/packages/astro/e2e/fixtures/multiple-frameworks/package.json
+++ b/packages/astro/e2e/fixtures/multiple-frameworks/package.json
@@ -12,12 +12,12 @@
},
"dependencies": {
"@webcomponents/template-shadowroot": "^0.2.1",
- "lit": "^3.1.4",
+ "lit": "^3.2.0",
"preact": "^10.23.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
- "solid-js": "^1.8.19",
+ "solid-js": "^1.8.20",
"svelte": "^4.2.18",
- "vue": "^3.4.35"
+ "vue": "^3.4.37"
}
}
diff --git a/packages/astro/e2e/fixtures/nested-in-preact/package.json b/packages/astro/e2e/fixtures/nested-in-preact/package.json
index 37e20359ac36..855c013a997a 100644
--- a/packages/astro/e2e/fixtures/nested-in-preact/package.json
+++ b/packages/astro/e2e/fixtures/nested-in-preact/package.json
@@ -14,8 +14,8 @@
"preact": "^10.23.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
- "solid-js": "^1.8.19",
+ "solid-js": "^1.8.20",
"svelte": "^4.2.18",
- "vue": "^3.4.35"
+ "vue": "^3.4.37"
}
}
diff --git a/packages/astro/e2e/fixtures/nested-in-react/package.json b/packages/astro/e2e/fixtures/nested-in-react/package.json
index 29d2a9e9a523..81f74f3ad4f9 100644
--- a/packages/astro/e2e/fixtures/nested-in-react/package.json
+++ b/packages/astro/e2e/fixtures/nested-in-react/package.json
@@ -14,8 +14,8 @@
"preact": "^10.23.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
- "solid-js": "^1.8.19",
+ "solid-js": "^1.8.20",
"svelte": "^4.2.18",
- "vue": "^3.4.35"
+ "vue": "^3.4.37"
}
}
diff --git a/packages/astro/e2e/fixtures/nested-in-solid/package.json b/packages/astro/e2e/fixtures/nested-in-solid/package.json
index d2c44020704c..0d9b59c9d831 100644
--- a/packages/astro/e2e/fixtures/nested-in-solid/package.json
+++ b/packages/astro/e2e/fixtures/nested-in-solid/package.json
@@ -14,8 +14,8 @@
"preact": "^10.23.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
- "solid-js": "^1.8.19",
+ "solid-js": "^1.8.20",
"svelte": "^4.2.18",
- "vue": "^3.4.35"
+ "vue": "^3.4.37"
}
}
diff --git a/packages/astro/e2e/fixtures/nested-in-svelte/package.json b/packages/astro/e2e/fixtures/nested-in-svelte/package.json
index 31bec20c305f..9cc7bdb3063b 100644
--- a/packages/astro/e2e/fixtures/nested-in-svelte/package.json
+++ b/packages/astro/e2e/fixtures/nested-in-svelte/package.json
@@ -14,8 +14,8 @@
"preact": "^10.23.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
- "solid-js": "^1.8.19",
+ "solid-js": "^1.8.20",
"svelte": "^4.2.18",
- "vue": "^3.4.35"
+ "vue": "^3.4.37"
}
}
diff --git a/packages/astro/e2e/fixtures/nested-in-vue/package.json b/packages/astro/e2e/fixtures/nested-in-vue/package.json
index 1985df63f95f..abbd45a703fb 100644
--- a/packages/astro/e2e/fixtures/nested-in-vue/package.json
+++ b/packages/astro/e2e/fixtures/nested-in-vue/package.json
@@ -14,8 +14,8 @@
"preact": "^10.23.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
- "solid-js": "^1.8.19",
+ "solid-js": "^1.8.20",
"svelte": "^4.2.18",
- "vue": "^3.4.35"
+ "vue": "^3.4.37"
}
}
diff --git a/packages/astro/e2e/fixtures/nested-recursive/package.json b/packages/astro/e2e/fixtures/nested-recursive/package.json
index 7a39d16e2498..18a9d346aece 100644
--- a/packages/astro/e2e/fixtures/nested-recursive/package.json
+++ b/packages/astro/e2e/fixtures/nested-recursive/package.json
@@ -14,9 +14,9 @@
"preact": "^10.23.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
- "solid-js": "^1.8.19",
+ "solid-js": "^1.8.20",
"svelte": "^4.2.18",
- "vue": "^3.4.35"
+ "vue": "^3.4.37"
},
"scripts": {
"dev": "astro dev"
diff --git a/packages/astro/e2e/fixtures/server-islands/astro.config.mjs b/packages/astro/e2e/fixtures/server-islands/astro.config.mjs
index 4bec97b9e1ad..2175a1bf8fe9 100644
--- a/packages/astro/e2e/fixtures/server-islands/astro.config.mjs
+++ b/packages/astro/e2e/fixtures/server-islands/astro.config.mjs
@@ -9,7 +9,7 @@ export default defineConfig({
output: 'hybrid',
adapter: nodejs({ mode: 'standalone' }),
integrations: [react(), mdx()],
- trailingSlash: 'always',
+ trailingSlash: process.env.TRAILING_SLASH ?? 'always',
experimental: {
serverIslands: true,
}
diff --git a/packages/astro/e2e/fixtures/server-islands/src/components/HTMLError.astro b/packages/astro/e2e/fixtures/server-islands/src/components/HTMLError.astro
new file mode 100644
index 000000000000..91b1946539c4
--- /dev/null
+++ b/packages/astro/e2e/fixtures/server-islands/src/components/HTMLError.astro
@@ -0,0 +1 @@
+
diff --git a/packages/astro/e2e/fixtures/server-islands/src/components/Island.astro b/packages/astro/e2e/fixtures/server-islands/src/components/Island.astro
index b7c376f517ad..5eab0dc4dfc3 100644
--- a/packages/astro/e2e/fixtures/server-islands/src/components/Island.astro
+++ b/packages/astro/e2e/fixtures/server-islands/src/components/Island.astro
@@ -1,4 +1,6 @@
---
+const { secret } = Astro.props;
---
I am an island
+{secret}
diff --git a/packages/astro/e2e/fixtures/server-islands/src/pages/index.astro b/packages/astro/e2e/fixtures/server-islands/src/pages/index.astro
index 998d6c074082..eff5df25e940 100644
--- a/packages/astro/e2e/fixtures/server-islands/src/pages/index.astro
+++ b/packages/astro/e2e/fixtures/server-islands/src/pages/index.astro
@@ -1,6 +1,7 @@
---
import Island from '../components/Island.astro';
import Self from '../components/Self.astro';
+import HTMLError from '../components/HTMLError.astro';
---
@@ -8,9 +9,20 @@ import Self from '../components/Self.astro';
-
+
children
+
+
+
+
+
+