0
Fork 0
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:
Bjorn Lu 2023-05-29 20:42:31 +08:00 committed by GitHub
parent df1e6f78df
commit af3c5a2e25
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 86 additions and 9 deletions

View file

@ -0,0 +1,5 @@
---
'astro': patch
---
Use `AstroError` for `Astro.glob` errors

View file

@ -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');
});
});

View file

@ -0,0 +1,3 @@
export function globSomething(Astro) {
return Astro.glob('./*.lua')
}

View file

@ -0,0 +1,3 @@
---
Astro.glob('./*.lua')
---

View file

@ -0,0 +1,5 @@
---
import { globSomething } from '../components/AstroGlobOutsideAstro'
globSomething(Astro)
---

View file

@ -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();

View file

@ -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
/**

View file

@ -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()));

View file

@ -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/);
});
});