mirror of
https://github.com/withastro/astro.git
synced 2024-12-16 21:46:22 -05:00
Use AstroError for Astro.glob errors (#7219)
Co-authored-by: Erika <3019731+Princesseuh@users.noreply.github.com> Co-authored-by: sarah11918 <sarah11918@users.noreply.github.com>
This commit is contained in:
parent
df1e6f78df
commit
af3c5a2e25
9 changed files with 86 additions and 9 deletions
5
.changeset/strange-socks-give.md
Normal file
5
.changeset/strange-socks-give.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
'astro': patch
|
||||
---
|
||||
|
||||
Use `AstroError` for `Astro.glob` errors
|
|
@ -1,14 +1,21 @@
|
|||
import { expect } from '@playwright/test';
|
||||
import { getErrorOverlayContent, testFactory } from './test-utils.js';
|
||||
import { getErrorOverlayContent, silentLogging, testFactory } from './test-utils.js';
|
||||
|
||||
const test = testFactory({
|
||||
root: './fixtures/errors/',
|
||||
// Only test the error overlay, don't print to console
|
||||
vite: {
|
||||
logLevel: 'silent',
|
||||
},
|
||||
});
|
||||
|
||||
let devServer;
|
||||
|
||||
test.beforeAll(async ({ astro }) => {
|
||||
devServer = await astro.startDevServer();
|
||||
devServer = await astro.startDevServer({
|
||||
// Only test the error overlay, don't print to console
|
||||
logging: silentLogging,
|
||||
});
|
||||
});
|
||||
|
||||
test.afterAll(async ({ astro }) => {
|
||||
|
@ -89,4 +96,16 @@ test.describe('Error display', () => {
|
|||
|
||||
expect(await page.locator('vite-error-overlay').count()).toEqual(0);
|
||||
});
|
||||
|
||||
test('astro glob no match error', async ({ page, astro }) => {
|
||||
await page.goto(astro.resolveUrl('/astro-glob-no-match'), { waitUntil: 'networkidle' });
|
||||
const message = (await getErrorOverlayContent(page)).message;
|
||||
expect(message).toMatch('did not return any matching files');
|
||||
});
|
||||
|
||||
test('astro glob used outside of an astro file', async ({ page, astro }) => {
|
||||
await page.goto(astro.resolveUrl('/astro-glob-outside-astro'), { waitUntil: 'networkidle' });
|
||||
const message = (await getErrorOverlayContent(page)).message;
|
||||
expect(message).toMatch('can only be used in');
|
||||
});
|
||||
});
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
export function globSomething(Astro) {
|
||||
return Astro.glob('./*.lua')
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
Astro.glob('./*.lua')
|
||||
---
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
import { globSomething } from '../components/AstroGlobOutsideAstro'
|
||||
|
||||
globSomething(Astro)
|
||||
---
|
|
@ -5,6 +5,8 @@ import { loadFixture as baseLoadFixture } from '../test/test-utils.js';
|
|||
|
||||
export const isWindows = process.platform === 'win32';
|
||||
|
||||
export { silentLogging } from '../test/test-utils.js';
|
||||
|
||||
// Get all test files in directory, assign unique port for each of them so they don't conflict
|
||||
const testFiles = await fs.readdir(new URL('.', import.meta.url));
|
||||
const testFileToPort = new Map();
|
||||
|
|
|
@ -719,6 +719,36 @@ See https://docs.astro.build/en/guides/server-side-rendering/ for more informati
|
|||
message: (imageFilePath: string) =>
|
||||
`\`Image\`'s and \`getImage\`'s \`src\` parameter must be an imported image or an URL, it cannot be a filepath. Received \`${imageFilePath}\`.`,
|
||||
},
|
||||
|
||||
/**
|
||||
* @docs
|
||||
* @see
|
||||
* - [Astro.glob](https://docs.astro.build/en/reference/api-reference/#astroglob)
|
||||
* @description
|
||||
* `Astro.glob()` can only be used in `.astro` files. You can use [`import.meta.glob()`](https://vitejs.dev/guide/features.html#glob-import) instead to acheive the same result.
|
||||
*/
|
||||
AstroGlobUsedOutside: {
|
||||
title: 'Astro.glob() used outside of an Astro file.',
|
||||
code: 3035,
|
||||
message: (globStr: string) =>
|
||||
`\`Astro.glob(${globStr})\` can only be used in \`.astro\` files. \`import.meta.glob(${globStr})\` can be used instead to achieve a similar result.`,
|
||||
hint: "See Vite's documentation on `import.meta.glob` for more information: https://vitejs.dev/guide/features.html#glob-import",
|
||||
},
|
||||
|
||||
/**
|
||||
* @docs
|
||||
* @see
|
||||
* - [Astro.glob](https://docs.astro.build/en/reference/api-reference/#astroglob)
|
||||
* @description
|
||||
* `Astro.glob()` did not return any matching files. There might be a typo in the glob pattern.
|
||||
*/
|
||||
AstroGlobNoMatch: {
|
||||
title: 'Astro.glob() did not match any files.',
|
||||
code: 3036,
|
||||
message: (globStr: string) =>
|
||||
`\`Astro.glob(${globStr})\` did not return any matching files. Check the pattern for typos.`,
|
||||
},
|
||||
|
||||
// No headings here, that way Vite errors are merged with Astro ones in the docs, which makes more sense to users.
|
||||
// Vite Errors - 4xxx
|
||||
/**
|
||||
|
|
|
@ -1,17 +1,22 @@
|
|||
import type { AstroGlobalPartial } from '../../@types/astro';
|
||||
import { ASTRO_VERSION } from '../../core/constants.js';
|
||||
import { AstroError, AstroErrorData } from '../../core/errors/index.js';
|
||||
|
||||
/** Create the Astro.glob() runtime function. */
|
||||
function createAstroGlobFn() {
|
||||
const globHandler = (importMetaGlobResult: Record<string, any>, globValue: () => any) => {
|
||||
if (typeof importMetaGlobResult === 'string') {
|
||||
throw new Error(
|
||||
'Astro.glob() does not work outside of an Astro file. Use `import.meta.glob()` instead.'
|
||||
);
|
||||
throw new AstroError({
|
||||
...AstroErrorData.AstroGlobUsedOutside,
|
||||
message: AstroErrorData.AstroGlobUsedOutside.message(JSON.stringify(importMetaGlobResult)),
|
||||
});
|
||||
}
|
||||
let allEntries = [...Object.values(importMetaGlobResult)];
|
||||
if (allEntries.length === 0) {
|
||||
throw new Error(`Astro.glob(${JSON.stringify(globValue())}) - no matches found.`);
|
||||
throw new AstroError({
|
||||
...AstroErrorData.AstroGlobNoMatch,
|
||||
message: AstroErrorData.AstroGlobNoMatch.message(JSON.stringify(importMetaGlobResult)),
|
||||
});
|
||||
}
|
||||
// Map over the `import()` promises, calling to load them.
|
||||
return Promise.all(allEntries.map((fn) => fn()));
|
||||
|
|
|
@ -6,8 +6,13 @@ describe('astro global', () => {
|
|||
const Astro = createAstro(undefined);
|
||||
expect(() => {
|
||||
Astro.glob('./**/*.md');
|
||||
}).to.throw(
|
||||
'Astro.glob() does not work outside of an Astro file. Use `import.meta.glob()` instead.'
|
||||
);
|
||||
}).to.throw(/can only be used in/);
|
||||
});
|
||||
|
||||
it('Glob should error if has no results', async () => {
|
||||
const Astro = createAstro(undefined);
|
||||
expect(() => {
|
||||
Astro.glob([], () => './**/*.md');
|
||||
}).to.throw(/did not return any matching files/);
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue