0
Fork 0
mirror of https://github.com/withastro/astro.git synced 2025-03-10 23:01:26 -05:00

Merge branch 'main' into arpan-#12506-ref

This commit is contained in:
Arpan Patel 2024-12-04 10:12:53 -06:00 committed by GitHub
commit a116f134fc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
77 changed files with 775 additions and 350 deletions

View file

@ -0,0 +1,5 @@
---
'astro': patch
---
Removes the misleading log message telling that a custom renderer is not recognized while it clearly is and works.

View file

@ -0,0 +1,5 @@
---
'@astrojs/upgrade': patch
---
Fixes an issue where running `upgrade` in a directory without `astro` installed shows a false success message

View file

@ -0,0 +1,5 @@
---
'astro': patch
---
Fixes an issue where the `experimental.svg` had incorrect type, resulting in some errors in the editors.

View file

@ -0,0 +1,5 @@
---
'@astrojs/db': patch
---
Fixes a bug that caused an error to be logged about invalid entrypoints

View file

@ -0,0 +1,5 @@
---
'astro': patch
---
Correctly handles images in content collections with uppercase file extensions

View file

@ -42,7 +42,7 @@ body:
id: bug-reproduction
attributes:
label: Link to Minimal Reproducible Example
description: 'Use [astro.new](https://astro.new) to create a minimal reproduction of the problem. **A minimal reproduction is required** so that others can help debug your issue. If a report is vague (e.g. just a generic error message) and has no reproduction, it may be auto-closed. Not sure how to create a minimal example? [Read our guide](https://docs.astro.build/en/guides/troubleshooting/#creating-minimal-reproductions)'
description: 'Use [StackBlitz](https://astro.new/repro) to create a minimal reproduction of the problem. **A minimal reproduction is required** so that others can help debug your issue. If a report is vague (e.g. just a generic error message) and has no reproduction, it may be auto-closed. Not sure how to create a minimal example? [Read our guide](https://docs.astro.build/en/guides/troubleshooting/#creating-minimal-reproductions)'
placeholder: 'https://stackblitz.com/abcd1234'
validations:
required: true

View file

@ -50,6 +50,7 @@ jobs:
uses: CodSpeedHQ/action@513a19673a831f139e8717bf45ead67e47f00044 # v3.2.0
timeout-minutes: 30
with:
run: pnpm benchmark codspeed
working-directory: ./benchmark
run: pnpm bench
token: ${{ secrets.CODSPEED_TOKEN }}

View file

@ -26,5 +26,5 @@ jobs:
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
body: |
Hello @${{ github.event.issue.user.login }}. Please provide a [minimal reproduction](https://stackoverflow.com/help/minimal-reproducible-example) using a GitHub repository or [StackBlitz](https://astro.new). Issues marked with `needs repro` will be closed if they have no activity within 3 days.
Hello @${{ github.event.issue.user.login }}. Please provide a [minimal reproduction](https://stackoverflow.com/help/minimal-reproducible-example) using a GitHub repository or [StackBlitz](https://astro.new/repro). Issues marked with `needs repro` will be closed if they have no activity within 3 days.
labels: "needs triage"

View file

@ -19,3 +19,14 @@ export function calculateStat(numbers) {
const max = Math.max(...numbers);
return { avg, stdev, max };
}
export async function makeProject(name) {
console.log('Making project:', name);
const projectDir = new URL(`../projects/${name}/`, import.meta.url);
const makeProjectMod = await import(`../make-project/${name}.js`);
await makeProjectMod.run(projectDir);
console.log('Finished making project:', name);
return projectDir;
}

View file

@ -0,0 +1,48 @@
import { fileURLToPath } from 'node:url';
import { exec } from 'tinyexec';
import { beforeAll, bench, describe } from 'vitest';
import { astroBin, makeProject } from './_util.js';
let streamingApp;
let nonStreamingApp;
beforeAll(async () => {
const render = await makeProject('render-bench');
const root = fileURLToPath(render);
await exec(astroBin, ['build'], {
nodeOptions: {
cwd: root,
stdio: 'inherit',
},
});
const entry = new URL('./dist/server/entry.mjs', `file://${root}`);
const { manifest, createApp } = await import(entry);
streamingApp = createApp(manifest, true);
nonStreamingApp = createApp(manifest, false);
}, 900000);
describe('Bench rendering', () => {
bench('Rendering: streaming [true], .astro file', async () => {
const request = new Request(new URL('http://exmpale.com/astro'));
await streamingApp.render(request);
});
bench('Rendering: streaming [true], .md file', async () => {
const request = new Request(new URL('http://exmpale.com/md'));
await streamingApp.render(request);
});
bench('Rendering: streaming [true], .mdx file', async () => {
const request = new Request(new URL('http://exmpale.com/mdx'));
await streamingApp.render(request);
});
bench('Rendering: streaming [false], .astro file', async () => {
const request = new Request(new URL('http://exmpale.com/astro'));
await nonStreamingApp.render(request);
});
bench('Rendering: streaming [false], .md file', async () => {
const request = new Request(new URL('http://exmpale.com/md'));
await nonStreamingApp.render(request);
});
bench('Rendering: streaming [false], .mdx file', async () => {
const request = new Request(new URL('http://exmpale.com/mdx'));
await nonStreamingApp.render(request);
});
});

View file

@ -1,64 +0,0 @@
import path from 'node:path';
import { withCodSpeed } from '@codspeed/tinybench-plugin';
import { Bench } from 'tinybench';
import { exec } from 'tinyexec';
import { astroBin } from './_util.js';
export async function run({ memory: _memory, render, stress: _stress }) {
const options = {
iterations: 10,
};
const bench = process.env.CODSPEED ? withCodSpeed(new Bench(options)) : new Bench(options);
await exec(astroBin, ['build'], {
nodeOptions: {
cwd: render.root,
stdio: 'inherit',
},
});
const entry = new URL('./dist/server/entry.mjs', `file://${render.root}`);
const { manifest, createApp } = await import(entry);
const streamingApp = createApp(manifest, true);
const nonStreamingApp = createApp(manifest, false);
bench
.add('Rendering: streaming [true], .astro file', async () => {
console.info('Start task.');
const request = new Request(new URL('http://exmpale.com/astro'));
await streamingApp.render(request);
console.info('Finish task.');
})
.add('Rendering: streaming [true], .md file', async () => {
console.info('Start task.');
const request = new Request(new URL('http://exmpale.com/md'));
await streamingApp.render(request);
console.info('Finish task.');
})
.add('Rendering: streaming [true], .mdx file', async () => {
console.info('Start task.');
const request = new Request(new URL('http://exmpale.com/mdx'));
await streamingApp.render(request);
console.info('Finish task.');
})
.add('Rendering: streaming [false], .astro file', async () => {
console.info('Start task.');
const request = new Request(new URL('http://exmpale.com/astro'));
await nonStreamingApp.render(request);
console.info('Finish task.');
})
.add('Rendering: streaming [false], .md file', async () => {
console.info('Start task.');
const request = new Request(new URL('http://exmpale.com/md'));
await nonStreamingApp.render(request);
console.info('Finish task.');
})
.add('Rendering: streaming [false], .mdx file', async () => {
console.info('Start task.');
const request = new Request(new URL('http://exmpale.com/mdx'));
await nonStreamingApp.render(request);
console.info('Finish task.');
});
await bench.run();
console.table(bench.table());
}

View file

@ -1,7 +1,8 @@
import mri from 'mri';
import fs from 'node:fs/promises';
import path from 'node:path';
import {fileURLToPath, pathToFileURL} from 'node:url';
import { fileURLToPath, pathToFileURL } from 'node:url';
import mri from 'mri';
import { makeProject } from './bench/_util.js';
const args = mri(process.argv.slice(2));
@ -14,7 +15,6 @@ Command
memory Run build memory and speed test
render Run rendering speed test
server-stress Run server stress test
codspeed Run codspeed test
cli-startup Run CLI startup speed test
Options
@ -30,7 +30,6 @@ const benchmarks = {
render: () => import('./bench/render.js'),
'server-stress': () => import('./bench/server-stress.js'),
'cli-startup': () => import('./bench/cli-startup.js'),
codspeed: () => import('./bench/codspeed.js')
};
if (commandName && !(commandName in benchmarks)) {
@ -39,26 +38,12 @@ if (commandName && !(commandName in benchmarks)) {
}
if (commandName) {
if (commandName === 'codspeed') {
const render = await makeProject('render-bench');
const rootRender = fileURLToPath(render);
const bench = benchmarks[commandName];
const benchMod = await bench();
const payload = {
render: {
root: rootRender,
output: await getOutputFile('render')
},
};
await benchMod.run(payload);
} else {
// Run single benchmark
const bench = benchmarks[commandName];
const benchMod = await bench();
const projectDir = await makeProject(args.project || benchMod.defaultProject);
const outputFile = await getOutputFile(commandName);
await benchMod.run(projectDir, outputFile);
}
// Run single benchmark
const bench = benchmarks[commandName];
const benchMod = await bench();
const projectDir = await makeProject(args.project || benchMod.defaultProject);
const outputFile = await getOutputFile(commandName);
await benchMod.run(projectDir, outputFile);
} else {
// Run all benchmarks
for (const name in benchmarks) {
@ -70,21 +55,10 @@ if (commandName) {
}
}
export async function makeProject(name) {
console.log('Making project:', name);
const projectDir = new URL(`./projects/${name}/`, import.meta.url);
const makeProjectMod = await import(`./make-project/${name}.js`);
await makeProjectMod.run(projectDir);
console.log('Finished making project:', name);
return projectDir;
}
/**
* @param {string} benchmarkName
*/
async function getOutputFile(benchmarkName) {
export async function getOutputFile(benchmarkName) {
let file;
if (args.output) {
file = pathToFileURL(path.resolve(args.output));

View file

@ -8,11 +8,13 @@ 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));
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}
@ -24,11 +26,10 @@ ${loremIpsumMd}
`;
promises.push(
fs.writeFile(new URL(`./src/content/blog/article-${i}.md`, projectDir), content, 'utf-8')
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),
`\
@ -46,7 +47,7 @@ const { Content } = await entry.render();
<h1>{entry.data.title}</h1>
<Content />
`,
'utf-8'
'utf-8',
);
await Promise.all(promises);
@ -58,6 +59,6 @@ import { defineConfig } from 'astro/config';
export default defineConfig({
});`,
'utf-8'
'utf-8',
);
}

View file

@ -23,7 +23,7 @@ ${loremIpsumMd}
`;
promises.push(
fs.writeFile(new URL(`./data/blog/article-${i}.md`, projectDir), content, 'utf-8')
fs.writeFile(new URL(`./data/blog/article-${i}.md`, projectDir), content, 'utf-8'),
);
}
@ -39,7 +39,7 @@ ${loremIpsumMd}
export const collections = { blog }
`
`,
);
await fs.writeFile(
@ -60,7 +60,7 @@ const { Content } = await render(entry);
<h1>{entry.data.title}</h1>
<Content />
`,
'utf-8'
'utf-8',
);
await Promise.all(promises);
@ -71,6 +71,6 @@ const { Content } = await render(entry);
import { defineConfig } from 'astro/config';
export default defineConfig({});`,
'utf-8'
'utf-8',
);
}

View file

@ -8,11 +8,13 @@ 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));
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}
@ -24,11 +26,10 @@ ${loremIpsumMd}
`;
promises.push(
fs.writeFile(new URL(`./src/content/blog/article-${i}.mdx`, projectDir), content, 'utf-8')
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),
`\
@ -46,7 +47,7 @@ const { Content } = await entry.render();
<h1>{entry.data.title}</h1>
<Content />
`,
'utf-8'
'utf-8',
);
await Promise.all(promises);
@ -61,6 +62,6 @@ import mdx from '@astrojs/mdx';
export default defineConfig({
integrations: [mdx()],
});`,
'utf-8'
'utf-8',
);
}

View file

@ -23,7 +23,7 @@ ${loremIpsumMd}
`;
promises.push(
fs.writeFile(new URL(`./data/blog/article-${i}.mdx`, projectDir), content, 'utf-8')
fs.writeFile(new URL(`./data/blog/article-${i}.mdx`, projectDir), content, 'utf-8'),
);
}
@ -39,7 +39,7 @@ ${loremIpsumMd}
export const collections = { blog }
`
`,
);
await fs.writeFile(
@ -60,7 +60,7 @@ const { Content } = await render(entry);
<h1>{entry.data.title}</h1>
<Content />
`,
'utf-8'
'utf-8',
);
await Promise.all(promises);
@ -75,6 +75,6 @@ import mdx from '@astrojs/mdx';
export default defineConfig({
integrations: [mdx()],
});`,
'utf-8'
'utf-8',
);
}

View file

@ -20,7 +20,7 @@ const i = ${i};
<span>{i}</span>
`;
promises.push(
fs.writeFile(new URL(`./src/pages/page-${i}.astro`, projectDir), content, 'utf-8')
fs.writeFile(new URL(`./src/pages/page-${i}.astro`, projectDir), content, 'utf-8'),
);
}
@ -31,7 +31,7 @@ const i = ${i};
${loremIpsum}
`;
promises.push(
fs.writeFile(new URL(`./src/content/blog/article-${i}.md`, projectDir), content, 'utf-8')
fs.writeFile(new URL(`./src/content/blog/article-${i}.md`, projectDir), content, 'utf-8'),
);
}
@ -42,7 +42,7 @@ ${loremIpsum}
${loremIpsum}
`;
promises.push(
fs.writeFile(new URL(`./src/content/blog/post-${i}.mdx`, projectDir), content, 'utf-8')
fs.writeFile(new URL(`./src/content/blog/post-${i}.mdx`, projectDir), content, 'utf-8'),
);
}
@ -63,7 +63,7 @@ const { Content } = await entry.render();
<h1>{entry.data.title}</h1>
<Content />
`,
'utf-8'
'utf-8',
);
await Promise.all(promises);
@ -77,6 +77,6 @@ import mdx from '@astrojs/mdx';
export default defineConfig({
integrations: [mdx()],
});`,
'utf-8'
'utf-8',
);
}

View file

@ -112,7 +112,7 @@ export async function run(projectDir) {
await Promise.all(
Object.entries(renderFiles).map(([name, content]) => {
return fs.writeFile(new URL(`./src/${name}`, projectDir), content, 'utf-8');
})
}),
);
await fs.writeFile(
@ -127,6 +127,6 @@ export default defineConfig({
output: 'server',
adapter: adapter(),
});`,
'utf-8'
'utf-8',
);
}

View file

@ -112,7 +112,7 @@ export async function run(projectDir) {
await Promise.all(
Object.entries(renderFiles).map(([name, content]) => {
return fs.writeFile(new URL(`./src/${name}`, projectDir), content, 'utf-8');
})
}),
);
await fs.writeFile(
@ -127,6 +127,6 @@ export default defineConfig({
output: 'server',
adapter: timer(),
});`,
'utf-8'
'utf-8',
);
}

View file

@ -38,13 +38,13 @@ const content = "${loremIpsum}"
</div>
</body>
</html>`,
'utf-8'
'utf-8',
);
await fs.writeFile(
new URL('./src/components/Paragraph.astro', projectDir),
`<div>{Astro.props.num} {Astro.props.str}</div>`,
'utf-8'
'utf-8',
);
await fs.writeFile(
@ -57,6 +57,6 @@ export default defineConfig({
output: 'server',
adapter: nodejs({ mode: 'standalone' }),
});`,
'utf-8'
'utf-8',
);
}

View file

@ -6,6 +6,9 @@
"bin": {
"astro-benchmark": "./index.js"
},
"scripts": {
"bench": "pnpm vitest bench --run"
},
"dependencies": {
"@astrojs/mdx": "workspace:*",
"@astrojs/node": "^8.3.4",
@ -21,7 +24,7 @@
"tinyexec": "^0.3.1"
},
"devDependencies": {
"@codspeed/tinybench-plugin": "^3.1.1",
"tinybench": "^2.9.0"
"@codspeed/vitest-plugin": "3.1.1",
"vitest": "2.1.8"
}
}

View file

@ -0,0 +1,7 @@
import codspeedPlugin from '@codspeed/vitest-plugin';
import { defineConfig } from 'vitest/config';
export default defineConfig({
plugins: process.env.CODSPEED ? [codspeedPlugin()] : [],
include: ['./bench/codspeed.bench.js'],
});

View file

@ -2,7 +2,7 @@
"$schema": "https://biomejs.dev/schemas/1.9.3/schema.json",
"files": {
"ignore": ["**/smoke/**", "**/fixtures/**", "**/_temp-fixtures/**", "**/vendor/**"],
"include": ["test/**", "e2e/**", "packages/**", "scripts/**", "benchmark/bench"],
"include": ["test/**", "e2e/**", "packages/**", "scripts/**", "benchmark"],
},
"vcs": {
"enabled": true,

View file

@ -10,6 +10,6 @@
"astro": "astro"
},
"dependencies": {
"astro": "^5.0.1"
"astro": "^5.0.2"
}
}

View file

@ -27,7 +27,7 @@ import background from '../assets/background.svg';
</section>
</main>
<a href="https://astro.build/blog/astro-5-beta/" id="news" class="box">
<a href="https://astro.build/blog/astro-5/" id="news" class="box">
<svg width="32" height="32" fill="none" xmlns="http://www.w3.org/2000/svg"
><path
d="M24.667 12c1.333 1.414 2 3.192 2 5.334 0 4.62-4.934 5.7-7.334 12C18.444 28.567 18 27.456 18 26c0-4.642 6.667-7.053 6.667-14Zm-5.334-5.333c1.6 1.65 2.4 3.43 2.4 5.333 0 6.602-8.06 7.59-6.4 17.334C13.111 27.787 12 25.564 12 22.666c0-4.434 7.333-8 7.333-16Zm-6-5.333C15.111 3.555 16 5.556 16 7.333c0 8.333-11.333 10.962-5.333 22-3.488-.774-6-4-6-8 0-8.667 8.666-10 8.666-20Z"

View file

@ -13,6 +13,6 @@
"@astrojs/mdx": "^4.0.1",
"@astrojs/rss": "^4.0.9",
"@astrojs/sitemap": "^3.2.1",
"astro": "^5.0.1"
"astro": "^5.0.2"
}
}

View file

@ -15,7 +15,7 @@
],
"scripts": {},
"devDependencies": {
"astro": "^5.0.1"
"astro": "^5.0.2"
},
"peerDependencies": {
"astro": "^4.0.0 || ^5.0.0"

View file

@ -12,7 +12,7 @@
},
"dependencies": {
"@astrojs/react": "^4.0.0",
"astro": "^5.0.1",
"astro": "^5.0.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"vitest": "^2.1.6"

View file

@ -13,6 +13,6 @@
"@astrojs/alpinejs": "^0.4.0",
"@types/alpinejs": "^3.13.10",
"alpinejs": "^3.14.3",
"astro": "^5.0.1"
"astro": "^5.0.2"
}
}

View file

@ -17,7 +17,7 @@
"@astrojs/vue": "^5.0.1",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"astro": "^5.0.1",
"astro": "^5.0.2",
"preact": "^10.24.3",
"react": "^18.3.1",
"react-dom": "^18.3.1",

View file

@ -12,7 +12,7 @@
"dependencies": {
"@astrojs/preact": "^4.0.0",
"@preact/signals": "^1.3.0",
"astro": "^5.0.1",
"astro": "^5.0.2",
"preact": "^10.24.3"
}
}

View file

@ -13,7 +13,7 @@
"@astrojs/react": "^4.0.0",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"astro": "^5.0.1",
"astro": "^5.0.2",
"react": "^18.3.1",
"react-dom": "^18.3.1"
}

View file

@ -11,7 +11,7 @@
},
"dependencies": {
"@astrojs/solid-js": "^5.0.0",
"astro": "^5.0.1",
"astro": "^5.0.2",
"solid-js": "^1.9.3"
}
}

View file

@ -11,7 +11,7 @@
},
"dependencies": {
"@astrojs/svelte": "^7.0.1",
"astro": "^5.0.1",
"astro": "^5.0.2",
"svelte": "^5.1.16"
}
}

View file

@ -11,7 +11,7 @@
},
"dependencies": {
"@astrojs/vue": "^5.0.1",
"astro": "^5.0.1",
"astro": "^5.0.2",
"vue": "^3.5.12"
}
}

View file

@ -10,7 +10,7 @@
"astro": "astro"
},
"dependencies": {
"@astrojs/node": "^9.0.0-alpha.1",
"astro": "^5.0.1"
"@astrojs/node": "^9.0.0",
"astro": "^5.0.2"
}
}

View file

@ -15,7 +15,7 @@
],
"scripts": {},
"devDependencies": {
"astro": "^5.0.1"
"astro": "^5.0.2"
},
"peerDependencies": {
"astro": "^4.0.0"

View file

@ -10,6 +10,6 @@
"astro": "astro"
},
"dependencies": {
"astro": "^5.0.1"
"astro": "^5.0.2"
}
}

View file

@ -10,6 +10,6 @@
"astro": "astro"
},
"dependencies": {
"astro": "^5.0.1"
"astro": "^5.0.2"
}
}

View file

@ -11,9 +11,9 @@
"server": "node dist/server/entry.mjs"
},
"dependencies": {
"@astrojs/node": "^9.0.0-alpha.1",
"@astrojs/node": "^9.0.0",
"@astrojs/svelte": "^7.0.1",
"astro": "^5.0.1",
"astro": "^5.0.2",
"svelte": "^5.1.16"
}
}

View file

@ -9,7 +9,7 @@
"astro": "astro"
},
"dependencies": {
"astro": "^5.0.1",
"astro": "^5.0.2",
"sass": "^1.80.6",
"sharp": "^0.33.3"
}

View file

@ -1,11 +1,13 @@
@use 'sass:map';
@function color($color, $tone) {
// @warn map-get($palette,$color);
// @warn map.get($palette,$color);
@if map-has-key($palette, $color) {
$color: map-get($palette, $color);
@if map.has-key($palette, $color) {
$color: map.get($palette, $color);
@if map-has-key($color, $tone) {
$tone: map-get($color, $tone);
@if map.has-key($color, $tone) {
$tone: map.get($color, $tone);
@return $tone;
}

View file

@ -1,3 +1,3 @@
@import 'colors.scss';
@import 'type.scss';
@import 'layout.scss';
@use 'colors.scss';
@use 'type.scss';
@use 'layout.scss';

View file

@ -1,3 +1,7 @@
@use 'sass:color';
@use './colors.scss' as colors;
@use './type.scss' as type;
$container: 1040px;
$tablet: 768px;
$mobile: 420px;
@ -11,9 +15,9 @@ body {
padding: 0 1em;
width: 1040px;
max-width: 100%;
background-color: $white;
background-color: colors.$white;
@media (prefers-color-scheme: dark) {
background-color: color(gray, 950);
background-color: colors.color(gray, 950);
}
@media (max-width: $tablet) {
font-size: 16px;
@ -39,8 +43,8 @@ body {
height: 240px;
background: radial-gradient(
50% 50% at 50% 50%,
rgba(color(orange, 500), 0.2) 0%,
rgba(color(orange, 500), 0) 100%
rgba(colors.color(orange, 500), 0.2) 0%,
rgba(colors.color(orange, 500), 0) 100%
);
@media (prefers-color-scheme: dark) {
background: radial-gradient(
@ -53,31 +57,31 @@ body {
}
::selection {
background: color(orange, 200);
background: colors.color(orange, 200);
@media (prefers-color-scheme: dark) {
background: color(orange, 600);
background: colors.color(orange, 600);
}
}
a,
a:visited {
color: color(orange, 600);
@media (prefers-color-scheme: dark) {
color: color(orange, 300);
}
color: colors.color(orange, 600);
transition: 0.1s ease;
@media (prefers-color-scheme: dark) {
color: colors.color(orange, 300);
}
&:hover {
color: color(orange, 500);
color: colors.color(orange, 500);
}
}
hr {
margin: 1em 0;
border: 0;
border-bottom: 1px solid color(gray, 100);
border-bottom: 1px solid colors.color(gray, 100);
@media (prefers-color-scheme: dark) {
border-color: color(gray, 900);
border-color: colors.color(gray, 900);
}
}
@ -102,22 +106,22 @@ nav {
display: flex;
align-items: center;
gap: 10px;
color: color(gray, 950);
@media (prefers-color-scheme: dark) {
color: $white;
}
color: colors.color(gray, 950);
font-size: 16px;
font-weight: 700;
letter-spacing: 2px;
line-height: 1;
text-decoration: none;
text-transform: uppercase;
@media (prefers-color-scheme: dark) {
color: colors.$white;
}
}
.links a {
margin-left: 1em;
color: color(gray, 800);
color: colors.color(gray, 800);
@media (prefers-color-scheme: dark) {
color: color(gray, 200);
color: colors.color(gray, 200);
}
}
}
@ -144,7 +148,7 @@ nav {
top: 0.63em;
width: 8px;
height: 8px;
background: linear-gradient(25deg, color(purple, 500), color(orange, 500));
background: linear-gradient(25deg, colors.color(purple, 500), colors.color(orange, 500));
border-radius: 99px;
}
}
@ -178,12 +182,12 @@ nav {
.version_wrapper {
flex-basis: 260px;
@media (max-width: $container) {
flex-basis: 140px;
}
flex-grow: 0;
flex-shrink: 0;
margin: 4.5em 0 0 0;
@media (max-width: $container) {
flex-basis: 140px;
}
@media (max-width: $tablet) {
flex-basis: 0;
margin-top: 2em;
@ -200,7 +204,7 @@ nav {
a {
float: left;
color: $white;
color: colors.$white;
text-decoration: none;
transition: 0.1s ease;
@ -212,45 +216,45 @@ nav {
.version_number {
display: inline-block;
font-family: $codeFont;
font-family: type.$codeFont;
line-height: 1;
margin-bottom: 8px;
padding: 4px 12px;
color: $white;
color: colors.$white;
background: linear-gradient(
25deg,
color(purple, 800),
color(purple, 700),
mix(color(purple, 500), color(orange, 500)),
color(orange, 500)
colors.color(purple, 800),
colors.color(purple, 700),
color.mix(colors.color(purple, 500), colors.color(orange, 500)),
colors.color(orange, 500)
);
border-radius: 8px;
}
.date {
clear: both;
color: colors.color(gray, 800);
font-family: type.$codeFont;
font-size: type.$fontSizeSmall;
@media (max-width: $tablet) {
display: inline;
margin-left: 1em;
}
color: color(gray, 800);
@media (prefers-color-scheme: dark) {
color: color(gray, 200);
color: colors.color(gray, 200);
}
font-family: $codeFont;
font-size: $fontSizeSmall;
}
.content {
margin: 0;
padding: 4em 0;
border-bottom: 1px solid colors.color(gray, 100);
@media (max-width: $tablet) {
margin: 1em 0;
padding: 0 0 2em 0;
}
border-bottom: 1px solid color(gray, 100);
@media (prefers-color-scheme: dark) {
border-color: color(gray, 900);
border-color: colors.color(gray, 900);
}
*:first-child {
margin-top: 0;
@ -259,9 +263,9 @@ nav {
max-width: 100%;
height: auto;
border-radius: 12px;
border: 1px solid color(gray, 200);
border: 1px solid colors.color(gray, 200);
@media (prefers-color-scheme: dark) {
border-color: color(gray, 800);
border-color: colors.color(gray, 800);
}
}
}
@ -269,22 +273,22 @@ nav {
footer {
display: flex;
padding: 2em 0;
color: colors.color(gray, 500);
justify-content: space-between;
border-top: 1px solid colors.color(gray, 100);
@media (max-width: $tablet) {
padding: 1em 0;
}
color: color(gray, 500);
justify-content: space-between;
border-top: 1px solid color(gray, 100);
@media (prefers-color-scheme: dark) {
border-color: color(gray, 900);
border-color: colors.color(gray, 900);
}
a {
margin-left: 1em;
color: color(gray, 500);
color: colors.color(gray, 500);
text-decoration: none;
&:hover {
color: color(gray, 500);
color: colors.color(gray, 500);
opacity: 0.6;
}
}

View file

@ -1,3 +1,5 @@
@use './colors.scss' as colors;
$baseFont: 'Lato', sans-serif;
$codeFont: 'Source Code Pro', monospace;
$fontSizeSmall: 15px;
@ -7,13 +9,14 @@ body {
font-size: 18px;
line-height: 1.65;
font-weight: 400;
@media (prefers-color-scheme: dark) {
color: color(gray, 200);
}
color: color(gray, 800);
color: colors.color(gray, 800);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
@media (prefers-color-scheme: dark) {
color: colors.color(gray, 200);
}
}
h1,
@ -23,11 +26,12 @@ h4,
h5 {
line-height: 1.2;
margin: 1em 0 0.5em 0;
@media (prefers-color-scheme: dark) {
color: $white;
}
color: color(gray, 950);
color: colors.color(gray, 950);
font-weight: 700;
@media (prefers-color-scheme: dark) {
color: colors.$white;
}
}
h1 {
@ -58,8 +62,9 @@ b,
strong {
font-weight: 700;
color: #fff;
color: colors.color(gray, 950);
@media (prefers-color-scheme: dark) {
color: $white;
color: colors.$white;
}
color: color(gray, 950);
}

View file

@ -15,6 +15,6 @@
"./app": "./dist/app.js"
},
"devDependencies": {
"astro": "^5.0.1"
"astro": "^5.0.2"
}
}

View file

@ -11,6 +11,6 @@
},
"dependencies": {
"@astrojs/markdoc": "^0.12.1",
"astro": "^5.0.1"
"astro": "^5.0.2"
}
}

View file

@ -3,6 +3,9 @@ import { getEntry } from 'astro:content';
import Layout from '../layouts/Layout.astro';
const intro = await getEntry('docs', 'intro');
if (!intro) {
return Astro.redirect('/404');
}
const { Content } = await intro.render();
---

View file

@ -12,7 +12,7 @@
"dependencies": {
"@astrojs/mdx": "^4.0.1",
"@astrojs/preact": "^4.0.0",
"astro": "^5.0.1",
"astro": "^5.0.2",
"preact": "^10.24.3"
}
}

View file

@ -12,7 +12,7 @@
"dependencies": {
"@astrojs/preact": "^4.0.0",
"@nanostores/preact": "^0.5.2",
"astro": "^5.0.1",
"astro": "^5.0.2",
"nanostores": "^0.11.3",
"preact": "^10.24.3"
}

View file

@ -13,7 +13,7 @@
"@astrojs/mdx": "^4.0.1",
"@astrojs/tailwind": "^5.1.3",
"@types/canvas-confetti": "^1.6.4",
"astro": "^5.0.1",
"astro": "^5.0.2",
"autoprefixer": "^10.4.20",
"canvas-confetti": "^1.9.3",
"postcss": "^8.4.49",

View file

@ -11,7 +11,7 @@
"test": "vitest"
},
"dependencies": {
"astro": "^5.0.1",
"astro": "^5.0.2",
"vitest": "^2.1.6"
}
}

View file

@ -1,5 +1,11 @@
# astro
## 5.0.2
### Patch Changes
- [#12601](https://github.com/withastro/astro/pull/12601) [`0724929`](https://github.com/withastro/astro/commit/072492982b338e04549ee576ca7d8480be92cc1c) Thanks [@ascorbic](https://github.com/ascorbic)! - Includes "undefined" in types for getEntry
## 5.0.1
### Patch Changes

View file

@ -1,6 +1,6 @@
{
"name": "astro",
"version": "5.0.1",
"version": "5.0.2",
"description": "Astro is a modern site builder with web best practices, performance, and DX front-of-mind.",
"type": "module",
"author": "withastro",

View file

@ -20,7 +20,9 @@ export function imageSrcToImportId(imageSrc: string, filePath?: string): string
return;
}
// We only care about images
const ext = imageSrc.split('.').at(-1) as (typeof VALID_INPUT_FORMATS)[number] | undefined;
const ext = imageSrc.split('.').at(-1)?.toLowerCase() as
| (typeof VALID_INPUT_FORMATS)[number]
| undefined;
if (!ext || !VALID_INPUT_FORMATS.includes(ext)) {
return;
}

View file

@ -30,7 +30,7 @@ export function vitePluginRenderers(opts: StaticBuildOptions): VitePlugin {
for (const renderer of opts.settings.renderers) {
const variable = `_renderer${i}`;
imports.push(`import ${variable} from '${renderer.serverEntrypoint}';`);
imports.push(`import ${variable} from ${JSON.stringify(renderer.serverEntrypoint)};`);
rendererItems += `Object.assign(${JSON.stringify(renderer)}, { ssr: ${variable} }),`;
i++;
}

View file

@ -30,7 +30,7 @@ function vitePluginAdapter(adapter: AstroAdapter): VitePlugin {
},
async load(id) {
if (id === RESOLVED_ADAPTER_VIRTUAL_MODULE_ID) {
return `export * from '${adapter.serverEntrypoint}';`;
return `export * from ${JSON.stringify(adapter.serverEntrypoint)};`;
}
},
};

View file

@ -11,6 +11,7 @@ import type { OutgoingHttpHeaders } from 'node:http';
import path from 'node:path';
import { fileURLToPath, pathToFileURL } from 'node:url';
import { z } from 'zod';
import type { SvgRenderMode } from '../../assets/utils/svg.js';
import { EnvSchema } from '../../env/schema.js';
import type { AstroUserConfig, ViteUserConfig } from '../../types/public/config.js';
import { appendForwardSlash, prependForwardSlash, removeTrailingForwardSlash } from '../path.js';
@ -96,9 +97,7 @@ export const ASTRO_CONFIG_DEFAULTS = {
clientPrerender: false,
contentIntellisense: false,
responsiveImages: false,
svg: {
mode: 'inline',
},
svg: false,
},
} satisfies AstroUserConfig & { server: { open: boolean } };
@ -540,18 +539,28 @@ export const AstroConfigSchema = z.object({
svg: z
.union([
z.boolean(),
z.object({
mode: z
.union([z.literal('inline'), z.literal('sprite')])
.optional()
.default(ASTRO_CONFIG_DEFAULTS.experimental.svg.mode),
}),
z
.object({
mode: z.union([z.literal('inline'), z.literal('sprite')]).optional(),
})
.optional(),
])
.optional()
.default(ASTRO_CONFIG_DEFAULTS.experimental.svg)
.transform((svgConfig) => {
// Handle normalization of `experimental.svg` config boolean values
if (typeof svgConfig === 'boolean') {
return svgConfig ? ASTRO_CONFIG_DEFAULTS.experimental.svg : undefined;
return svgConfig
? {
mode: 'inline' as SvgRenderMode,
}
: undefined;
} else {
if (!svgConfig.mode) {
return {
mode: 'inline' as SvgRenderMode,
};
}
}
return svgConfig;
}),

View file

@ -260,15 +260,6 @@ If you're still stuck, please open an issue on GitHub or join us at https://astr
}
} else {
if (metadata.hydrate === 'only') {
const rendererName = rendererAliases.has(metadata.hydrateArgs)
? rendererAliases.get(metadata.hydrateArgs)
: metadata.hydrateArgs;
if (!clientOnlyValues.has(rendererName)) {
// warning if provide incorrect client:only directive but find the renderer by guess
console.warn(
`The client:only directive for ${metadata.displayName} is not recognized. The renderer ${renderer.name} will be used. If you intended to use a different renderer, please provide a valid client:only directive.`,
);
}
html = await renderSlotToString(result, slots?.fallback);
} else {
const componentRenderStartTime = performance.now();

View file

@ -322,7 +322,7 @@ export interface ViteUserConfig extends OriginalViteUserConfig {
* @type {string}
* @default `"."` (current working directory)
* @summary Set the project root. The project root is the directory where your Astro project (and all `src`, `public` and `package.json` files) live.
* @description You should only provide this option if you run the `astro` CLI commands in a directory other than the project root directory. Usually, this option is provided via the CLI instead of the [Astro config file](https://docs.astro.build/en/guides/configuring-astro/#supported-config-file-types), since Astro needs to know your project root before it can locate your config file.
* @description You should only provide this option if you run the `astro` CLI commands in a directory other than the project root directory. Usually, this option is provided via the CLI instead of the Astro config file, since Astro needs to know your project root before it can locate your config file.
*
* If you provide a relative path (ex: `--root: './my-project'`) Astro will resolve it against your current working directory.
*
@ -1940,28 +1940,30 @@ export interface ViteUserConfig extends OriginalViteUserConfig {
* For a complete overview, and to give feedback on this experimental API,
* see the [Feature RFC](https://github.com/withastro/roadmap/pull/1035).
*/
svg?: {
/**
*
* @name experimental.svg.mode
* @type {string}
* @default 'inline'
*
* The default technique for handling imported SVG files. Astro will inline the SVG content into your HTML output if not specified.
*
* - `inline`: Astro will inline the SVG content into your HTML output.
* - `sprite`: Astro will generate a sprite sheet with all imported SVG files.
*
* ```astro
* ---
* import Logo from './path/to/svg/file.svg';
* ---
*
* <Logo size={24} mode="sprite" />
* ```
*/
mode?: SvgRenderMode;
};
svg?:
| boolean
| {
/**
*
* @name experimental.svg.mode
* @type {string}
* @default 'inline'
*
* The default technique for handling imported SVG files. Astro will inline the SVG content into your HTML output if not specified.
*
* - `inline`: Astro will inline the SVG content into your HTML output.
* - `sprite`: Astro will generate a sprite sheet with all imported SVG files.
*
* ```astro
* ---
* import Logo from './path/to/svg/file.svg';
* ---
*
* <Logo size={24} mode="sprite" />
* ```
*/
mode: SvgRenderMode;
};
};
}

View file

@ -92,7 +92,9 @@ declare module 'astro:content' {
collection: C,
id: E,
): E extends keyof DataEntryMap[C]
? Promise<DataEntryMap[C][E]>
? string extends keyof DataEntryMap[C]
? Promise<DataEntryMap[C][E]> | undefined
: Promise<DataEntryMap[C][E]>
: Promise<CollectionEntry<C> | undefined>;
/** Resolve an array of entry references from the same collection */

View file

@ -217,6 +217,12 @@ describe('Content Layer', () => {
assert.equal(json.entryWithReference.data.heroImage.format, 'jpg');
});
it('loads images with uppercase extensions', async () => {
assert.ok(json.atlantis.data.heroImage.src.startsWith('/_astro'));
assert.ok(json.atlantis.data.heroImage.src.endsWith('.JPG'));
assert.equal(json.atlantis.data.heroImage.format, 'jpg');
});
it('loads images from custom loaders', async () => {
assert.ok(json.images[0].data.image.src.startsWith('/_astro'));
assert.equal(json.images[0].data.image.format, 'jpg');

View file

@ -0,0 +1,42 @@
import assert from 'node:assert/strict';
import { after, before, describe, it } from 'node:test';
import * as cheerio from 'cheerio';
import { loadFixture } from './test-utils.js';
describe('Custom Renderer - SSR', () => {
let fixture;
before(async () => {
fixture = await loadFixture({
root: './fixtures/custom-renderer/',
});
});
describe('dev', () => {
let devServer;
before(async () => {
devServer = await fixture.startDevServer();
});
after(async () => {
await devServer.stop();
});
it('renders /', async () => {
const html = await fixture.fetch('/').then((res) => res.text());
const $ = cheerio.load(html);
assert.equal($('h1').text(), 'Client Directives');
});
it('renders SSR custom renderer functional components as expected', async () => {
const res = await fixture.fetch('/');
assert.equal(res.status, 200);
const html = await res.text();
const $ = cheerio.load(html);
assert.equal($('p').length, 5);
});
});
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View file

@ -0,0 +1,11 @@
---
title: Atlantis
description: 'Learn about the Atlantis NASA space shuttle.'
publishedDate: 'Sat May 21 2022 00:00:00 GMT-0400 (Eastern Daylight Time)'
tags: [space, 90s]
heroImage: "./atlantis.JPG"
---
**Source:** [Wikipedia](https://en.wikipedia.org/wiki/Space_Shuttle_Atlantis)
Space Shuttle Atlantis (Orbiter Vehicle Designation: OV-104) is a Space Shuttle orbiter vehicle belonging to the National Aeronautics and Space Administration (NASA), the spaceflight and space exploration agency of the United States. Constructed by the Rockwell International company in Southern California and delivered to the Kennedy Space Center in Eastern Florida in April 1985, Atlantis is the fourth operational and the second-to-last Space Shuttle built. Its maiden flight was STS-51-J from 3 to 7 October 1985.

View file

@ -12,6 +12,7 @@ export async function GET() {
const simpleLoader = await getCollection('cats');
const entryWithReference = await getEntry('spacecraft', 'columbia-copy');
const atlantis = await getEntry('spacecraft', 'atlantis');
const referencedEntry = await getEntry(entryWithReference.data.cat);
const entryWithImagePath = await getEntry('spacecraft', 'lunar-module');
@ -49,6 +50,7 @@ export async function GET() {
yamlLoader,
tomlLoader,
nestedJsonLoader,
atlantis
})
);
}

View file

@ -0,0 +1,9 @@
import { defineConfig } from 'astro/config';
// in a real-world scenario, this would be provided a separate package
import customRenderer from './src/custom-renderer';
// https://astro.build/config
export default defineConfig({
integrations: [customRenderer()]
});

View file

@ -0,0 +1,11 @@
{
"name": "@test/custom-renderer",
"version": "0.0.0",
"private": true,
"dependencies": {
"astro": "workspace:*"
},
"scripts": {
"dev": "astro dev"
}
}

View file

@ -0,0 +1,10 @@
export interface Props {
msg: string;
}
export default function CustomRendererTest({ msg }: Props) {
return {
tag: "p",
text: msg
}
}

View file

@ -0,0 +1,25 @@
export default (parentElement: HTMLElement) =>
async (
Component: any,
props: Record<string, any>,
//{ default: children, ...slotted }: Record<string, any>,
//{ client }: Record<string, string>,
) => {
// in a real-world scenario, this would be a more complex function
// actually rendering the components return value (which might be an AST/VDOM)
const vdom = Component(props);
const node: Node = document.createElement(vdom.tag);
node.textContent = `${vdom.text} (rendered by client.ts)`;
parentElement.appendChild(node);
// cleanup
parentElement.addEventListener('astro:unmount', () => {
if (node.parentNode) {
node.parentNode.removeChild(node);
}
}, { once: true });
};

View file

@ -0,0 +1,23 @@
import type { AstroIntegration, AstroRenderer, ContainerRenderer } from 'astro';
const getRenderer = (): AstroRenderer => ({
name: 'custom-renderer',
clientEntrypoint: '@custom-renderer/client',
serverEntrypoint: '@custom-renderer/server',
})
export const getContainerRenderer = (): ContainerRenderer => ({
name: 'custom-renderer',
serverEntrypoint: '@custom-renderer/server',
})
export default function (): AstroIntegration {
return {
name: 'custom-renderer',
hooks: {
'astro:config:setup': ({ addRenderer }) => {
addRenderer(getRenderer());
},
},
};
}

View file

@ -0,0 +1,42 @@
import type { NamedSSRLoadedRendererValue, SSRResult } from 'astro';
type RendererContext = {
result: SSRResult;
};
async function check(
this: RendererContext,
Component: any,
//props: Record<string, any>,
//children: any,
) {
if (typeof Component !== 'function') return false;
// in a real-world scenario, this would be a more complex function
// that checks if the component should be rendered
return true;
}
async function renderToStaticMarkup(
this: RendererContext,
Component: any,
props: Record<string, any>,
//{ default: children, ...slotted }: Record<string, any>,
//metadata: AstroComponentMetadata | undefined,
) {
// in a real-world scenario, this would be a more complex function
// actually rendering the components return value (which might be an AST/VDOM)
// and render it as an HTML string
const vdom = Component(props);
return { attrs: {}, html: `<${vdom.tag}>${vdom.text} (rendered by server.ts)</${vdom.tag}>` };
}
const renderer: NamedSSRLoadedRendererValue = {
name: 'custom-renderer',
check,
renderToStaticMarkup,
supportsAstroStaticSlot: false,
};
export default renderer;

View file

@ -0,0 +1,30 @@
---
import CustomRendererTest from '../components/CustomRendererTest';
---
<html>
<head>
<title>Custom Framework / Custom Renderer</title>
</head>
<body>
<h1>Client Directives</h1>
<div>
<CustomRendererTest msg="client:only" client:only="custom-renderer" />
</div>
<div>
<CustomRendererTest msg="client:load" client:load />
</div>
<div>
<CustomRendererTest msg="client:visible" client:visible />
</div>
<div>
<CustomRendererTest msg="client:media" client:media="(max-width: 50em)" />
</div>
<div>
<CustomRendererTest msg="client:idle" client:idle />
</div>
<div>
<CustomRendererTest msg="none (SSR)" />
</div>
</body>
</html>

View file

@ -0,0 +1,9 @@
{
"extends": "astro/tsconfigs/base",
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@custom-renderer/*": ["src/custom-renderer/*"]
},
}
}

View file

@ -16,7 +16,7 @@ import {
} from 'vite';
import parseArgs from 'yargs-parser';
import { AstroDbError } from '../../runtime/utils.js';
import { CONFIG_FILE_NAMES, DB_PATH } from '../consts.js';
import { CONFIG_FILE_NAMES, DB_PATH, VIRTUAL_MODULE_ID } from '../consts.js';
import { EXEC_DEFAULT_EXPORT_ERROR, EXEC_ERROR } from '../errors.js';
import { resolveDbConfig } from '../load-file.js';
import { SEED_DEV_FILE_NAME } from '../queries.js';
@ -153,7 +153,7 @@ function astroDBIntegration(): AstroIntegration {
);
// Eager load astro:db module on startup
if (seedFiles.get().length || localSeedPaths.find((path) => existsSync(path))) {
server.ssrLoadModule(resolved.module).catch((e) => {
server.ssrLoadModule(VIRTUAL_MODULE_ID).catch((e) => {
logger.error(e instanceof Error ? e.message : String(e));
});
}

View file

@ -24,7 +24,13 @@ export async function verify(
}
}
await verifyAstroProject(ctx);
const isAstroProject = await verifyAstroProject(ctx);
if (!isAstroProject) {
bannerAbort();
newline();
error('error', `Astro installation not found in the current directory.`);
ctx.exit(1);
}
const ok = await verifyVersions(ctx, registry);
if (!ok) {

314
pnpm-lock.yaml generated
View file

@ -100,12 +100,12 @@ importers:
specifier: ^0.3.1
version: 0.3.1
devDependencies:
'@codspeed/tinybench-plugin':
specifier: ^3.1.1
version: 3.1.1(tinybench@2.9.0)
tinybench:
specifier: ^2.9.0
version: 2.9.0
'@codspeed/vitest-plugin':
specifier: 3.1.1
version: 3.1.1(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vitest@2.1.8(@types/node@18.19.50)(jsdom@23.2.0)(sass@1.81.0))
vitest:
specifier: 2.1.8
version: 2.1.8(@types/node@18.19.50)(jsdom@23.2.0)(sass@1.81.0)
benchmark/packages/adapter:
dependencies:
@ -142,7 +142,7 @@ importers:
examples/basics:
dependencies:
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
examples/blog:
@ -157,13 +157,13 @@ importers:
specifier: ^3.2.1
version: link:../../packages/integrations/sitemap
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
examples/component:
devDependencies:
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
examples/container-with-vitest:
@ -172,7 +172,7 @@ importers:
specifier: ^4.0.0
version: link:../../packages/integrations/react
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
react:
specifier: ^18.3.1
@ -203,7 +203,7 @@ importers:
specifier: ^3.14.3
version: 3.14.3
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
examples/framework-multiple:
@ -230,7 +230,7 @@ importers:
specifier: ^18.3.1
version: 18.3.1
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
preact:
specifier: ^10.24.3
@ -260,7 +260,7 @@ importers:
specifier: ^1.3.0
version: 1.3.0(preact@10.24.3)
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
preact:
specifier: ^10.24.3
@ -278,7 +278,7 @@ importers:
specifier: ^18.3.1
version: 18.3.1
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
react:
specifier: ^18.3.1
@ -293,7 +293,7 @@ importers:
specifier: ^5.0.0
version: link:../../packages/integrations/solid
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
solid-js:
specifier: ^1.9.3
@ -305,7 +305,7 @@ importers:
specifier: ^7.0.1
version: link:../../packages/integrations/svelte
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
svelte:
specifier: ^5.1.16
@ -317,7 +317,7 @@ importers:
specifier: ^5.0.1
version: link:../../packages/integrations/vue
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
vue:
specifier: ^3.5.12
@ -326,40 +326,40 @@ importers:
examples/hackernews:
dependencies:
'@astrojs/node':
specifier: ^9.0.0-alpha.1
version: 9.0.0-alpha.1(astro@packages+astro)
specifier: ^9.0.0
version: 9.0.0(astro@packages+astro)
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
examples/integration:
devDependencies:
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
examples/minimal:
dependencies:
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
examples/portfolio:
dependencies:
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
examples/ssr:
dependencies:
'@astrojs/node':
specifier: ^9.0.0-alpha.1
version: 9.0.0-alpha.1(astro@packages+astro)
specifier: ^9.0.0
version: 9.0.0(astro@packages+astro)
'@astrojs/svelte':
specifier: ^7.0.1
version: link:../../packages/integrations/svelte
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
svelte:
specifier: ^5.1.16
@ -368,7 +368,7 @@ importers:
examples/starlog:
dependencies:
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
sass:
specifier: ^1.80.6
@ -380,7 +380,7 @@ importers:
examples/toolbar-app:
devDependencies:
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
examples/with-markdoc:
@ -389,7 +389,7 @@ importers:
specifier: ^0.12.1
version: link:../../packages/integrations/markdoc
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
examples/with-mdx:
@ -401,7 +401,7 @@ importers:
specifier: ^4.0.0
version: link:../../packages/integrations/preact
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
preact:
specifier: ^10.24.3
@ -416,7 +416,7 @@ importers:
specifier: ^0.5.2
version: 0.5.2(nanostores@0.11.3)(preact@10.24.3)
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
nanostores:
specifier: ^0.11.3
@ -437,7 +437,7 @@ importers:
specifier: ^1.6.4
version: 1.6.4
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
autoprefixer:
specifier: ^10.4.20
@ -455,7 +455,7 @@ importers:
examples/with-vitest:
dependencies:
astro:
specifier: ^5.0.1
specifier: ^5.0.2
version: link:../../packages/astro
vitest:
specifier: ^2.1.6
@ -2942,6 +2942,12 @@ importers:
specifier: workspace:*
version: link:../../..
packages/astro/test/fixtures/custom-renderer:
dependencies:
astro:
specifier: workspace:*
version: link:../../..
packages/astro/test/fixtures/data-collections:
dependencies:
astro:
@ -5630,11 +5636,6 @@ packages:
peerDependencies:
astro: ^5.0.0
'@astrojs/node@9.0.0-alpha.1':
resolution: {integrity: sha512-5KsaJYuAnKP4tmT/skEWLs4UP6FQhtwIVa26MBU5imiS/aL33cIwmZ7Gl2W0rP/t4Wnz9ehf42lXWXLPekhETw==}
peerDependencies:
astro: ^5.0.0-alpha.0
'@astrojs/yaml2ts@0.2.1':
resolution: {integrity: sha512-CBaNwDQJz20E5WxzQh4thLVfhB3JEEGz72wRA+oJp6fQR37QLAqXZJU0mHC+yqMOQ6oj0GfRPJrz6hjf+zm6zA==}
@ -5940,10 +5941,11 @@ packages:
'@codspeed/core@3.1.1':
resolution: {integrity: sha512-ONhERVDAtkm0nc+FYPivDozoMOlNUP2BWRBFDJYATGA18Iap5Kd2mZ1/Lwz54RB5+g+3YDOpsvotHa4hd3Q+7Q==}
'@codspeed/tinybench-plugin@3.1.1':
resolution: {integrity: sha512-LVF4End0kDU9V7CzuwAcmngSPJNnpduPnr+csOKvcG++FsYwfUuBJ1rvLPtv6yTkvxpUmUEsj6VA7/AEIBGZVw==}
'@codspeed/vitest-plugin@3.1.1':
resolution: {integrity: sha512-/PJUgxIfuRqpBSbaD8bgWXtbXxCqgnW89dzr3220fMkx/LA6z6oUb4tJGjeVsOWAzAgu0VBdSA+8hC+7D9BIuQ==}
peerDependencies:
tinybench: ^2.3.0
vite: ^4.2.0 || ^5.0.0
vitest: '>=1.2.2'
'@colors/colors@1.5.0':
resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
@ -7333,6 +7335,9 @@ packages:
'@vitest/expect@2.1.6':
resolution: {integrity: sha512-9M1UR9CAmrhJOMoSwVnPh2rELPKhYo0m/CSgqw9PyStpxtkwhmdM6XYlXGKeYyERY1N6EIuzkQ7e3Lm1WKCoUg==}
'@vitest/expect@2.1.8':
resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==}
'@vitest/mocker@2.1.6':
resolution: {integrity: sha512-MHZp2Z+Q/A3am5oD4WSH04f9B0T7UvwEb+v5W0kCYMhtXGYbdyl2NUk1wdSMqGthmhpiThPDp/hEoVwu16+u1A==}
peerDependencies:
@ -7344,21 +7349,47 @@ packages:
vite:
optional: true
'@vitest/mocker@2.1.8':
resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==}
peerDependencies:
msw: ^2.4.9
vite: ^5.0.0
peerDependenciesMeta:
msw:
optional: true
vite:
optional: true
'@vitest/pretty-format@2.1.6':
resolution: {integrity: sha512-exZyLcEnHgDMKc54TtHca4McV4sKT+NKAe9ix/yhd/qkYb/TP8HTyXRFDijV19qKqTZM0hPL4753zU/U8L/gAA==}
'@vitest/pretty-format@2.1.8':
resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==}
'@vitest/runner@2.1.6':
resolution: {integrity: sha512-SjkRGSFyrA82m5nz7To4CkRSEVWn/rwQISHoia/DB8c6IHIhaE/UNAo+7UfeaeJRE979XceGl00LNkIz09RFsA==}
'@vitest/runner@2.1.8':
resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==}
'@vitest/snapshot@2.1.6':
resolution: {integrity: sha512-5JTWHw8iS9l3v4/VSuthCndw1lN/hpPB+mlgn1BUhFbobeIUj1J1V/Bj2t2ovGEmkXLTckFjQddsxS5T6LuVWw==}
'@vitest/snapshot@2.1.8':
resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==}
'@vitest/spy@2.1.6':
resolution: {integrity: sha512-oTFObV8bd4SDdRka5O+mSh5w9irgx5IetrD5i+OsUUsk/shsBoHifwCzy45SAORzAhtNiprUVaK3hSCCzZh1jQ==}
'@vitest/spy@2.1.8':
resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==}
'@vitest/utils@2.1.6':
resolution: {integrity: sha512-ixNkFy3k4vokOUTU2blIUvOgKq/N2PW8vKIjZZYsGJCMX69MRa9J2sKqX5hY/k5O5Gty3YJChepkqZ3KM9LyIQ==}
'@vitest/utils@2.1.8':
resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==}
'@volar/kit@2.4.6':
resolution: {integrity: sha512-OaMtpmLns6IYD1nOSd0NdG/F5KzJ7Jr4B7TLeb4byPzu+ExuuRVeO56Dn1C7Frnw6bGudUQd90cpQAmxdB+RlQ==}
peerDependencies:
@ -10212,10 +10243,6 @@ packages:
engines: {node: '>=10'}
hasBin: true
send@0.18.0:
resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
engines: {node: '>= 0.8.0'}
send@0.19.0:
resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
engines: {node: '>= 0.8.0'}
@ -10786,6 +10813,11 @@ packages:
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
vite-node@2.1.8:
resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
vite-plugin-inspect@0.8.7:
resolution: {integrity: sha512-/XXou3MVc13A5O9/2Nd6xczjrUwt7ZyI9h8pTnUMkr5SshLcb0PJUOVq2V+XVkdeU4njsqAtmK87THZuO2coGA==}
engines: {node: '>=14'}
@ -10822,6 +10854,37 @@ packages:
peerDependencies:
vue: '>=3.2.13'
vite@5.4.11:
resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
'@types/node': ^18.0.0 || >=20.0.0
less: '*'
lightningcss: ^1.21.0
sass: '*'
sass-embedded: '*'
stylus: '*'
sugarss: '*'
terser: ^5.4.0
peerDependenciesMeta:
'@types/node':
optional: true
less:
optional: true
lightningcss:
optional: true
sass:
optional: true
sass-embedded:
optional: true
stylus:
optional: true
sugarss:
optional: true
terser:
optional: true
vite@6.0.1:
resolution: {integrity: sha512-Ldn6gorLGr4mCdFnmeAOLweJxZ34HjKnDm4HGo6P66IEqTxQb36VEdFJQENKxWjupNfoIjvRUnswjn1hpYEpjQ==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
@ -10895,6 +10958,31 @@ packages:
jsdom:
optional: true
vitest@2.1.8:
resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
'@types/node': ^18.0.0 || >=20.0.0
'@vitest/browser': 2.1.8
'@vitest/ui': 2.1.8
happy-dom: '*'
jsdom: '*'
peerDependenciesMeta:
'@edge-runtime/vm':
optional: true
'@types/node':
optional: true
'@vitest/browser':
optional: true
'@vitest/ui':
optional: true
happy-dom:
optional: true
jsdom:
optional: true
volar-service-css@0.0.61:
resolution: {integrity: sha512-Ct9L/w+IB1JU8F4jofcNCGoHy6TF83aiapfZq9A0qYYpq+Kk5dH+ONS+rVZSsuhsunq8UvAuF8Gk6B8IFLfniw==}
peerDependencies:
@ -11326,14 +11414,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@astrojs/node@9.0.0-alpha.1(astro@packages+astro)':
dependencies:
astro: link:packages/astro
send: 0.18.0
server-destroy: 1.0.1
transitivePeerDependencies:
- supports-color
'@astrojs/yaml2ts@0.2.1':
dependencies:
yaml: 2.5.1
@ -11781,11 +11861,11 @@ snapshots:
transitivePeerDependencies:
- debug
'@codspeed/tinybench-plugin@3.1.1(tinybench@2.9.0)':
'@codspeed/vitest-plugin@3.1.1(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))(vitest@2.1.8(@types/node@18.19.50)(jsdom@23.2.0)(sass@1.81.0))':
dependencies:
'@codspeed/core': 3.1.1
stack-trace: 1.0.0-pre2
tinybench: 2.9.0
vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)
vitest: 2.1.8(@types/node@18.19.50)(jsdom@23.2.0)(sass@1.81.0)
transitivePeerDependencies:
- debug
@ -13046,6 +13126,13 @@ snapshots:
chai: 5.1.2
tinyrainbow: 1.2.0
'@vitest/expect@2.1.8':
dependencies:
'@vitest/spy': 2.1.8
'@vitest/utils': 2.1.8
chai: 5.1.2
tinyrainbow: 1.2.0
'@vitest/mocker@2.1.6(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1))':
dependencies:
'@vitest/spy': 2.1.6
@ -13054,31 +13141,64 @@ snapshots:
optionalDependencies:
vite: 6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)
'@vitest/mocker@2.1.8(vite@5.4.11(@types/node@18.19.50)(sass@1.81.0))':
dependencies:
'@vitest/spy': 2.1.8
estree-walker: 3.0.3
magic-string: 0.30.14
optionalDependencies:
vite: 5.4.11(@types/node@18.19.50)(sass@1.81.0)
'@vitest/pretty-format@2.1.6':
dependencies:
tinyrainbow: 1.2.0
'@vitest/pretty-format@2.1.8':
dependencies:
tinyrainbow: 1.2.0
'@vitest/runner@2.1.6':
dependencies:
'@vitest/utils': 2.1.6
pathe: 1.1.2
'@vitest/runner@2.1.8':
dependencies:
'@vitest/utils': 2.1.8
pathe: 1.1.2
'@vitest/snapshot@2.1.6':
dependencies:
'@vitest/pretty-format': 2.1.6
magic-string: 0.30.14
pathe: 1.1.2
'@vitest/snapshot@2.1.8':
dependencies:
'@vitest/pretty-format': 2.1.8
magic-string: 0.30.14
pathe: 1.1.2
'@vitest/spy@2.1.6':
dependencies:
tinyspy: 3.0.2
'@vitest/spy@2.1.8':
dependencies:
tinyspy: 3.0.2
'@vitest/utils@2.1.6':
dependencies:
'@vitest/pretty-format': 2.1.6
loupe: 3.1.2
tinyrainbow: 1.2.0
'@vitest/utils@2.1.8':
dependencies:
'@vitest/pretty-format': 2.1.8
loupe: 3.1.2
tinyrainbow: 1.2.0
'@volar/kit@2.4.6(typescript@5.7.2)':
dependencies:
'@volar/language-service': 2.4.6
@ -16492,24 +16612,6 @@ snapshots:
semver@7.6.3: {}
send@0.18.0:
dependencies:
debug: 2.6.9
depd: 2.0.0
destroy: 1.2.0
encodeurl: 1.0.2
escape-html: 1.0.3
etag: 1.8.1
fresh: 0.5.2
http-errors: 2.0.0
mime: 1.6.0
ms: 2.1.3
on-finished: 2.4.1
range-parser: 1.2.1
statuses: 2.0.1
transitivePeerDependencies:
- supports-color
send@0.19.0:
dependencies:
debug: 2.6.9
@ -17213,6 +17315,24 @@ snapshots:
- tsx
- yaml
vite-node@2.1.8(@types/node@18.19.50)(sass@1.81.0):
dependencies:
cac: 6.7.14
debug: 4.3.7
es-module-lexer: 1.5.4
pathe: 1.1.2
vite: 5.4.11(@types/node@18.19.50)(sass@1.81.0)
transitivePeerDependencies:
- '@types/node'
- less
- lightningcss
- sass
- sass-embedded
- stylus
- sugarss
- supports-color
- terser
vite-plugin-inspect@0.8.7(rollup@4.27.4)(vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1)):
dependencies:
'@antfu/utils': 0.7.10
@ -17278,6 +17398,16 @@ snapshots:
svgo: 3.3.2
vue: 3.5.13(typescript@5.7.2)
vite@5.4.11(@types/node@18.19.50)(sass@1.81.0):
dependencies:
esbuild: 0.21.5
postcss: 8.4.49
rollup: 4.27.4
optionalDependencies:
'@types/node': 18.19.50
fsevents: 2.3.3
sass: 1.81.0
vite@6.0.1(@types/node@18.19.50)(jiti@1.21.6)(sass@1.81.0)(yaml@2.5.1):
dependencies:
esbuild: 0.24.0
@ -17333,6 +17463,42 @@ snapshots:
- tsx
- yaml
vitest@2.1.8(@types/node@18.19.50)(jsdom@23.2.0)(sass@1.81.0):
dependencies:
'@vitest/expect': 2.1.8
'@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@18.19.50)(sass@1.81.0))
'@vitest/pretty-format': 2.1.8
'@vitest/runner': 2.1.8
'@vitest/snapshot': 2.1.8
'@vitest/spy': 2.1.8
'@vitest/utils': 2.1.8
chai: 5.1.2
debug: 4.3.7
expect-type: 1.1.0
magic-string: 0.30.14
pathe: 1.1.2
std-env: 3.8.0
tinybench: 2.9.0
tinyexec: 0.3.1
tinypool: 1.0.1
tinyrainbow: 1.2.0
vite: 5.4.11(@types/node@18.19.50)(sass@1.81.0)
vite-node: 2.1.8(@types/node@18.19.50)(sass@1.81.0)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 18.19.50
jsdom: 23.2.0
transitivePeerDependencies:
- less
- lightningcss
- msw
- sass
- sass-embedded
- stylus
- sugarss
- supports-color
- terser
volar-service-css@0.0.61(@volar/language-service@2.4.6):
dependencies:
vscode-css-languageservice: 6.3.1