mirror of
https://github.com/withastro/astro.git
synced 2025-01-06 22:10:10 -05:00
Prevent frontmatter errors from crashing dev server (#6675)
* Prevent frontmatter errors from crashing dev server * fix windows
This commit is contained in:
parent
fc0ed9c53c
commit
1f783e3207
4 changed files with 92 additions and 2 deletions
5
.changeset/flat-baboons-nail.md
Normal file
5
.changeset/flat-baboons-nail.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
'astro': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Prevent frontmatter errors from crashing the dev server
|
|
@ -226,8 +226,17 @@ export async function createContentTypesGenerator({
|
||||||
events.push(event);
|
events.push(event);
|
||||||
|
|
||||||
debounceTimeout && clearTimeout(debounceTimeout);
|
debounceTimeout && clearTimeout(debounceTimeout);
|
||||||
|
const runEventsSafe = async () => {
|
||||||
|
try {
|
||||||
|
await runEvents(opts);
|
||||||
|
} catch {
|
||||||
|
// Prevent frontmatter errors from crashing the server. The errors
|
||||||
|
// are still reported on page reflects as desired.
|
||||||
|
// Errors still crash dev from *starting*.
|
||||||
|
}
|
||||||
|
};
|
||||||
debounceTimeout = setTimeout(
|
debounceTimeout = setTimeout(
|
||||||
async () => runEvents(opts),
|
runEventsSafe,
|
||||||
50 /* debounce to batch chokidar events */
|
50 /* debounce to batch chokidar events */
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
import { fileURLToPath } from 'node:url';
|
||||||
|
import nodeFS from 'node:fs';
|
||||||
|
import path from 'node:path';
|
||||||
|
import slash from 'slash';
|
||||||
|
|
||||||
|
import { runInContainer } from '../../../dist/core/dev/index.js';
|
||||||
|
import { attachContentServerListeners } from '../../../dist/content/index.js';
|
||||||
|
import { createFs, triggerFSEvent } from '../test-utils.js';
|
||||||
|
|
||||||
|
const root = new URL('../../fixtures/alias/', import.meta.url);
|
||||||
|
|
||||||
|
function getTypesDts() {
|
||||||
|
const typesdtsURL = new URL('../../../src/content/template/types.d.ts', import.meta.url);
|
||||||
|
const relpath = slash(path.relative(fileURLToPath(root), fileURLToPath(typesdtsURL)));
|
||||||
|
return {
|
||||||
|
[relpath]: nodeFS.readFileSync(typesdtsURL, 'utf-8')
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('frontmatter', () => {
|
||||||
|
it('errors in content/ does not crash server', async () => {
|
||||||
|
const fs = createFs(
|
||||||
|
{
|
||||||
|
...getTypesDts(),
|
||||||
|
'/src/content/posts/blog.md': `
|
||||||
|
---
|
||||||
|
title: One
|
||||||
|
---
|
||||||
|
`,
|
||||||
|
'/src/content/config.ts': `
|
||||||
|
import { defineCollection, z } from 'astro:content';
|
||||||
|
|
||||||
|
const posts = defineCollection({
|
||||||
|
schema: z.string()
|
||||||
|
});
|
||||||
|
|
||||||
|
export const collections = {
|
||||||
|
posts
|
||||||
|
};
|
||||||
|
`,
|
||||||
|
'/src/pages/index.astro': `
|
||||||
|
---
|
||||||
|
---
|
||||||
|
<html>
|
||||||
|
<head><title>Test</title></head>
|
||||||
|
<body class="one">
|
||||||
|
<h1>Test</h1>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
root
|
||||||
|
);
|
||||||
|
|
||||||
|
await runInContainer({ fs, root }, async (container) => {
|
||||||
|
await attachContentServerListeners(container);
|
||||||
|
|
||||||
|
fs.writeFileFromRootSync(
|
||||||
|
'/src/content/posts/blog.md',
|
||||||
|
`
|
||||||
|
---
|
||||||
|
title: One
|
||||||
|
title: two
|
||||||
|
---
|
||||||
|
`
|
||||||
|
);
|
||||||
|
triggerFSEvent(container, fs, '/src/content/posts/blog.md', 'change');
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 100));
|
||||||
|
// Note, if we got here, it didn't crash
|
||||||
|
});
|
||||||
|
})
|
||||||
|
});
|
|
@ -3,7 +3,7 @@ import { Volume } from 'memfs';
|
||||||
import httpMocks from 'node-mocks-http';
|
import httpMocks from 'node-mocks-http';
|
||||||
import realFS from 'node:fs';
|
import realFS from 'node:fs';
|
||||||
import npath from 'path';
|
import npath from 'path';
|
||||||
import { fileURLToPath } from 'url';
|
import { fileURLToPath, pathToFileURL } from 'url';
|
||||||
import { unixify } from './correct-path.js';
|
import { unixify } from './correct-path.js';
|
||||||
|
|
||||||
class VirtualVolume extends Volume {
|
class VirtualVolume extends Volume {
|
||||||
|
@ -26,6 +26,10 @@ class VirtualVolume extends Volume {
|
||||||
return npath.posix.join(this.#root, pth);
|
return npath.posix.join(this.#root, pth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
readFile(p, ...args) {
|
||||||
|
return super.readFile(this.#forcePath(p), ...args);
|
||||||
|
}
|
||||||
|
|
||||||
existsSync(p) {
|
existsSync(p) {
|
||||||
return super.existsSync(this.#forcePath(p));
|
return super.existsSync(this.#forcePath(p));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue